62,615
社区成员
发帖
与我相关
我的任务
分享
'4 UTF编码
'UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
'UCS-2编码(16进制) UTF-8 字节流(二进制)
'0000 - 007F 0xxxxxxx
'0080 - 07FF 110xxxxx 10xxxxxx
'0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
'例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,
'所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。'
'将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,
'得到:11100110 10110001 10001001,即E6 B1 89。
'读者可以用记事本测试一下我们的编码是否正确?
'UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。
'UTF-8有点类似于Haffman编码,它将Unicode编码为00000000-0000007F的字符,用单个字节来表示;
'00000080-000007FF的字符用两个字节表示
'00000800-0000FFFF的字符用3字节表示
Function ByteStreamtoUTF8String(para_1() As Byte) As String
'功能:字节流转为字符串
'参数说明:para_1为需转换的字节流
Dim iLoop As Long
Dim jj As Currency
Dim tempstring As String
Dim lngstring As Long
On Error Resume Next
For iLoop = 0 To UBound(para_1)
'遍历转换字节流
If para_1(iLoop) > 0 And para_1(iLoop) <= 127 Then
'如果是ASCII
tempstring = tempstring & Chr(para_1(iLoop)) '得到ASCII表示的字符
ElseIf para_1(iLoop) >= 128 And para_1(iLoop) <= 223 Then
'如果是汉字
lngstring = ((CInt(para_1(iLoop)) - 128#) * 64#) '计算高位
iLoop = iLoop + 1
lngstring = lngstring + para_1(iLoop) - 128# '计算低位
tempstring = tempstring & ChrW(lngstring) '得到汉字
ElseIf para_1(iLoop) >= 224 Then
'如果是汉字
lngstring = ((CInt(para_1(iLoop)) - 224#) * 4096#)
iLoop = iLoop + 1
lngstring = lngstring + ((CInt(para_1(iLoop)) - 128#) * 64#) '计算高位
iLoop = iLoop + 1
lngstring = lngstring + para_1(iLoop) - 128# '计算低位
tempstring = tempstring & ChrW(lngstring) '得到汉字
End If
Next
tempstring = CStr(tempstring)
ByteStreamtoUTF8String = tempstring
'main.errmessage = New frmerrmessage("程序出现异常,无法正常运行!", "错误编码:A00031")
'main.errmessage.ShowDialog()
Exit Function
End Function