VB6的UTF8编码解码

‘UTF-8编码

 Public Function UTF8Encode(ByVal szInput As StringAs String

    Dim wch  As String

    Dim uch As String

    Dim szRet As String

    Dim As Long

    Dim inputLen As Long

    Dim nAsc  As Long

    Dim nAsc2 As Long

    Dim nAsc3 As Long

    

    If szInput = "" Then

        UTF8Encode = szInput

        Exit Function

    End If

    inputLen = Len(szInput)

    For x = 1 To inputLen

    ‘得到每个字符

        wch = Mid(szInput, x, 1)

        ‘得到相应的UNICODE编码

        nAsc = AscW(wch)

    ‘对于<0的编码 其需要加上65536

        If nAsc < 0 Then nAsc = nAsc + 65536

    ‘对于<128位的ASCII的编码则无需更改

        If (nAsc And &HFF80) = 0 Then

            szRet = szRet & wch

        Else

            If (nAsc And &HF000) = 0 Then

            ‘真正的第二层编码范围为000080 - 0007FF

            ‘Unicode在范围D800-DFFF中不存在任何字符,基本多文种平面中约定了这个范围用于UTF-16扩展标识辅助平面(两个UTF-16表示一个辅助平面字符).

            ‘当然,任何编码都是可以被转换到这个范围,但在unicode中他们并不代表任何合法的值。

    

                uch = "%" & Hex(((nAsc \ 2 ^ 6)) Or &HC0) & Hex(nAsc And &H3F Or &H80)

                szRet = szRet & uch

                

            Else

            ‘第三层编码00000800 – 0000FFFF

            ‘首先取其前四位与11100000进行或去处得到UTF-8编码的前8位

            ‘其次取其前10位与111111进行并运算,这样就能得到其前10中最后6位的真正的编码 再与10000000进行或运算来得到UTF-8编码中间的8位

            ‘最后将其与111111进行并运算,这样就能得到其最后6位的真正的编码 再与10000000进行或运算来得到UTF-8编码最后8位编码

                uch = "%" & Hex((nAsc \ 2 ^ 12) Or &HE0) & "%" & _

                Hex((nAsc \ 2 ^ 6) And &H3F Or &H80) & "%" & _

                Hex(nAsc And &H3F Or &H80)

                szRet = szRet & uch

            End If

        End If

    Next

    

    UTF8Encode = szRet

End Function

‘UTF-8解码(2-25更改,采用递归方法,可以对一串字符串解码,仅仅为演示此算法,请不要随意调用)

‘形式类如department=%E4%B9%B3%E8%85%BA‘%E5%A4%96%E7%A7%91

Public Function UTF8BadDecode(ByVal code As StringAs String

    If code = "" Then

        Exit Function

    End If

   

    Dim tmp As String

    Dim decodeStr As String

    Dim codelen As Long

    Dim result As String

    Dim leftStr As String

   

    leftStr = Left(code, 1)

   

    If leftStr = "" Then

   

        UTF8BadDecode = ""

        Exit Function

       

    ElseIf leftStr <> "%" Then

   

        UTF8BadDecode = leftStr + UTF8BadDecode(Right(code, Len(code) - 1))

       

    ElseIf leftStr = "%" Then

   

        codelen = Len(code)

       

        If (Mid(code, 2, 1) = "C" Or Mid(code, 2, 1) = "B"Then

            decodeStr = Replace(Mid(code, 1, 6), "%""")

            tmp = c10ton(Val("&H" & Hex(Val("&H" & decodeStr) And &H1F3F)))

            tmp = String(16 - Len(tmp), "0") & tmp

            UTF8BadDecode = UTF8BadDecode & ChrW(Val("&H" & c2to16(Mid(tmp, 3, 4)) & c2to16(Mid(tmp, 7, 2) & Mid(tmp, 11, 2)) & Right(decodeStr, 1))) & UTF8BadDecode(Right(code, codelen - 6))

        ElseIf (Mid(code, 2, 1) = "E"Then

            decodeStr = Replace(Mid(code, 1, 9), "%""")

            tmp = c10ton((Val("&H" & Mid(Hex(Val("&H" & decodeStr) And &HF3F3F), 2, 3))))

            tmp = String(10 - Len(tmp), "0") & tmp

            UTF8BadDecode = ChrW(Val("&H" & (Mid(decodeStr, 2, 1) & c2to16(Mid(tmp, 1, 4)) & c2to16(Mid(tmp, 5, 2) & Right(tmp, 2)) & Right(decodeStr, 1)))) & UTF8BadDecode(Right(code, codelen - 9))

        Else

            UTF8BadDecode = Chr(Val("&H" & (Mid(code, 2, 2)))) & UTF8BadDecode(Right(code, codelen - 3))

        End If

       

    End If

End Function

‘UTF-8解码(3-12更改,可以解多个字符串 可供正常使用)

Public Function UTF8Decode(ByVal code As StringAs String

    If code = "" Then

        UTF8Decode = ""

        Exit Function

    End If

   

    Dim tmp As String

    Dim decodeStr As String

    Dim codelen As Long

    Dim result As String

    Dim leftStr As String

    

    leftStr = Left(code, 1)

    

    While (code <> "")

        codelen = Len(code)

        leftStr = Left(code, 1)

        If leftStr = "%" Then

                If (Mid(code, 2, 1) = "C" Or Mid(code, 2, 1) = "B"Then

                    decodeStr = Replace(Mid(code, 1, 6), "%""")

                    tmp = c10ton(Val("&H" & Hex(Val("&H" & decodeStr) And &H1F3F)))

                    tmp = String(16 - Len(tmp), "0") & tmp

                    UTF8Decode = UTF8Decode & UTF8Decode & ChrW(Val("&H" & c2to16(Mid(tmp, 3, 4)) & c2to16(Mid(tmp, 7, 2) & Mid(tmp, 11, 2)) & Right(decodeStr, 1)))

                    code = Right(code, codelen - 6)

                ElseIf (Mid(code, 2, 1) = "E"Then

                    decodeStr = Replace(Mid(code, 1, 9), "%""")

                    tmp = c10ton((Val("&H" & Mid(Hex(Val("&H" & decodeStr) And &HF3F3F), 2, 3))))

                    tmp = String(10 - Len(tmp), "0") & tmp

                    UTF8Decode = UTF8Decode & ChrW(Val("&H" & (Mid(decodeStr, 2, 1) & c2to16(Mid(tmp, 1, 4)) & c2to16(Mid(tmp, 5, 2) & Right(tmp, 2)) & Right(decodeStr, 1))))

                    code = Right(code, codelen - 9)

                End If

        Else

            UTF8Decode = UTF8Decode & leftStr

            code = Right(code, codelen - 1)

        End If

    Wend

End Function

‘gb2312编码

Public Function GBKEncode(szInput) As String

    Dim As Long

    Dim startIndex As Long

    Dim endIndex As Long

    Dim x() As Byte

    

    x = StrConv(szInput, vbFromUnicode)

    

    startIndex = LBound(x)

    endIndex = UBound(x)

    For i = startIndex To endIndex

        GBKEncode = GBKEncode & "%" & Hex(x(i))

    Next

End Function

‘GB2312编码

Public Function GBKDecode(ByVal code As StringAs String

    code = Replace(code, "%""")

    Dim bytes(1) As Byte

    Dim index As Long

    Dim length As Long

    Dim codelen As Long

    codelen = Len(code)

    While (codelen > 3)

        For index = 1 To 2

            bytes(index - 1) = Val("&H" & Mid(code, index * 2 - 1, 2))

        Next index

        GBKDecode = GBKDecode & StrConv(bytes, vbUnicode)

        code = Right(code, codelen - 4)

        codelen = Len(code)

    Wend

End Function

‘二进制代码转换为十六进制代码

Public Function c2to16(ByVal As StringAs String

   Dim As Long

   i = 1

   For i = 1 To Len(x) Step 4

      c2to16 = c2to16 & Hex(c2to10(Mid(x, i, 4)))

   Next

End Function

‘二进制代码转换为十进制代码

Public Function c2to10(ByVal As StringAs String

   c2to10 = 0

   If x = "0" Then Exit Function

   Dim As Long

   i = 0

   For i = 0 To Len(x) - 1

      If Mid(x, Len(x) - i, 1) = "1" Then c2to10 = c2to10 + 2 ^ (i)

   Next

End Function

‘10进制转n进制(默认2)

Public Function c10ton(ByVal As IntegerOptional ByVal As Integer = 2) As String

    Dim As Integer

    i = x \ n

    If i > 0 Then

        If Mod n > 10 Then

            c10ton = c10ton(i, n) + chr(x Mod n + 55)

        Else

            c10ton = c10ton(i, n) + CStr(x Mod n)

        End If

    Else

        If x > 10 Then

            c10ton = chr(x + 55)

        Else

            c10ton = CStr(x)

        End If

    End If

End Function

时间: 2024-08-06 19:26:54

VB6的UTF8编码解码的相关文章

JavaScript进行UTF-8编码与解码

JavaScript本身可通过charCodeAt方法得到一个字符的Unicode编码,并通过fromCharCode方法将Unicode编码转换成对应字符. 但charCodeAt方法得到的应该是一个16位的整数,每个字符占用两字节.在网络上传输一般采用UTF-8编码,JavaScript本身没有提供此类方法.不过有一个简便的办法来实现UTF-8的编码与解码. Web要求URL的查询字符串采用UTF-8编码,对于一些特殊字符或者中文等,会编码成多个字节,变成%加相应16进制码的形式.比如:汉字

Python8_关于编码解码和utf-8

关于编码:ASCII码是早期的编码规范,只能表示128个字符.7位二进制数表示 扩展ASCII码,由于ASCII码不够用,ASCII表扩充到256个符号,不同的国家有不同的标准:8位二进制数 Unicode 准确来说不是编码格式,而是字符集.这个字符集包含了世界上所有的符号所有字符长度统一用16位表示,因此字符是定长的: GB2312 在ASCII码表的基础上,小于127的字符意义与原来相同,而将大于127的字节连在一起,表示汉字前一个字节从0xA1(161)到0xF7(247)共87个,称为高

编码解码--三种常见字符编码简介:ASCII、Unicode和UTF-8

什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. ASCII编码: 由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母.数字和一些符

[C语言]Base64编码解码

Base64编码解码 一,Base64编码原理 Base64编码的字符数组如下所示 : ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 字符串转Base64编码:取3字节的字符串转换为四字节的字符串,依次往后转换.得到Base64编码字符串.具体原理如下: 1,如果需要编码的原串字节数刚好为3的倍数,那么转换规则如下: 以中文字符'严'为例,'严'字的UTF-8编码为:0xE4B8A5 = 11100100  10

修改Netbeans默认使用UTF-8编码

NetBeans是一款优秀的开源集成开发环境,可以用于Java,C/C++,PHP等语言的开发.同时它也是一个可扩展的开发平台,可以通过插件来扩 展官方版本没有的功能.自从被Oracle这个开源杀手收购以后,发展一直很缓慢,7.0到现在才发布.NetBeans有一个很弱智的地方,打开文件时 不能自动识别文件编码,更弱智的是,发现编码错误出现乱码时,不能直接改变编码.例如默认设置打开一个UTF-8编码的文件,会出现乱码. 如果要NetBeans用UTF-8对文件进行解码,需要修改配置文件,具体方法

C#对字符串进行编码解码

以UTF8编码格式为例: 1 //编码 2 ViewBag.FileURL = HttpUtility.UrlEncode(UriString, Encoding.UTF8); 3 //解码 4 FileURL = HttpUtility.UrlDecode(FileURL, UTF8Encoding.UTF8);

做网站用UTF-8编码还是GB2312编码?

经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符, WordPress程序是用的UTF-8,很多cms用的是GB2312. ● 为什么有这么多编码? ● UTF-8和GB2312有什么区别? ● 我们在国内做网站是用UTF-8编码格式还是GB2312编码格式好? 一. 各种编码的来历 可能很多同学一直对字符的各种编码方式懵懵懂懂,根本搞不清为什么他们有这么多编码. ANSI编码 其实在很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合

Java GBK,UTF-8编码

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/41366301 1.GBK,UTF-8编码 注意:一般默认的是GBK编码. package io.dol.sn; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class EnCodeStream { public st

将UTF8编码转化为中文 - NSString方法

方法一: 代码如下,如有更好的方法 麻烦贴出来,这个方法是通过webview进行解码的 UIWebView *web = [[UIWebView alloc] init]; NSString *tsw = @"%E4%B8%AD%E5%9B%BD"; NSString *sc = [NSString stringWithFormat:@"decodeURIComponent('%@')",tsw]; NSString *st = [web stringByEvalu