[转]有关UTF-8的一些资料

一, 最重要的,UTF-8和Unicode的转换

UTF-8 编码是一种被广泛应用的编码,这种编码致力于把全球的语言纳入一个统一的编码,目前已经将几种亚洲语言纳入。UTF 代表 UCS Transformation Format.

UTF-8 采用变长度字节来表示字符,理论上最多可以到 6 个字节长度。UTF-8 编码兼容了 ASC II(0-127), 也就是说 UTF-8 对于 ASC II 字符的编码是和 ASC II 一样的。对于超过一个字节长度的字符,才用以下编码规范:

左边第一个字节1的个数表示这个字符编码字节的位数,例如两位字节字符编码样式为为:110xxxxx 10xxxxxx; 三位字节字符的编码样式为:1110xxxx 10xxxxxx 10xxxxxx.;以此类推,六位字节字符的编码样式为:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。 xxx 的值由字符编码的二进制表示的位填入。只用最短的那个足够表达一个字符编码的多字节串。例如:

Unicode 字符: 00 A9(版权符号) = 1010 1001, UTF-8 编码为:11000010 10101001 = 0x C2 0xA9; 字符 22 60 (不等于符号) = 0010 0010 0110 0000, UTF-8 编码为:11100010 10001001 10100000 = 0xE2 0x89 0xA0

以上转换例子已经确认是正确的,不用怀疑,如果看不懂请再仔细想想

Unicode编码和utf-8编码之间的对应关系表
The table below summarizes the format of these different octet types.
    The letter x indicates bits available for encoding bits of the
    character number.

 

    Char. number range   |         UTF-8 octet sequence
       (hexadecimal)     |               (binary)
    --------------------+---------------------------------------------
    0000 0000-0000 007F | 0xxxxxxx
    0000 0080-0000 07FF | 110xxxxx 10xxxxxx
    0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx     //A/
    0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
这是一个Unicode编码和utf-8编码之间的对应关系表。中文的Unicode编码范围在0000 0800-0000 FFFF 中。

二, 关于BOM

UTF-8以字节为编码单元,没有字节序的问题。UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字 节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流“594E”,那么这 是“奎”还是“乙”?

  Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:

  在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。

  这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

  UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

三, VB实现UTF-8转Unicode的函数

1.不使用API

Function Utf8ToUnicode(ByRef Utf() As Byte) As String
Dim utfLen As Long

utfLen = -1
On Error Resume Next
utfLen = UBound(Utf)
If utfLen = -1 Then Exit Function

On Error GoTo 0

Dim i As Long, j As Long, k As Long, N As Long
Dim B As Byte, cnt As Byte
Dim Buf() As String
ReDim Buf(utfLen)

i = 0
j = 0
Do While i <= utfLen
       B = Utf(i)
      
       If (B And &HFC) = &HFC Then
         cnt = 6
       ElseIf (B And &HF8) = &HF8 Then
         cnt = 5
       ElseIf (B And &HF0) = &HF0 Then
         cnt = 4
       ElseIf (B And &HE0) = &HE0 Then
         cnt = 3
       ElseIf (B And &HC0) = &HC0 Then
         cnt = 2
       Else
         cnt = 1
       End If
      
       If i + cnt - 1 > utfLen Then
         Buf(j) = "?"
         Exit Do
       End If
      
       Select Case cnt
       Case 2
         N = B And &H1F
       Case 3
         N = B And &HF
       Case 4
         N = B And &H7
       Case 5
         N = B And &H3
       Case 6
         N = B And &H1
       Case Else
         Buf(j) = Chr(B)
         GoTo Continued:
       End Select
           
       For k = 1 To cnt - 1
         B = Utf(i + k)
         N = N * &H40 + (B And &H3F)
       Next
      
       Buf(j) = ChrW(N)
Continued:
       i = i + cnt
       j = j + 1
Loop

Utf8ToUnicode = Join(Buf, "")
End Function

2. 使用API (包括Unicode转UTF-8)

Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Const CP_UTF8 = 65001


Function Utf8ToUnicode(ByRef Utf() As Byte) As String
Dim lRet As Long
Dim lLength As Long
Dim lBufferSize As Long
lLength = UBound(Utf) - LBound(Utf) + 1
If lLength <= 0 Then Exit Function
lBufferSize = lLength * 2
Utf8ToUnicode = String$(lBufferSize, Chr(0))
lRet = MultiByteToWideChar(CP_UTF8, 0, VarPtr(Utf(0)), lLength, StrPtr(Utf8ToUnicode), lBufferSize)
If lRet <> 0 Then
       Utf8ToUnicode = Left(Utf8ToUnicode, lRet)
End If
End Function

Function UnicodeToUtf8(ByVal UCS As String) As Byte()
Dim lLength As Long
Dim lBufferSize As Long
Dim lResult As Long
Dim abUTF8() As Byte
lLength = Len(UCS)
If lLength = 0 Then Exit Function
lBufferSize = lLength * 3 + 1
ReDim abUTF8(lBufferSize - 1)
lResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(UCS), lLength, abUTF8(0), lBufferSize, vbNullString, 0)
If lResult <> 0 Then
lResult = lResult - 1
ReDim Preserve abUTF8(lResult)
UnicodeToUtf8 = abUTF8
End If
End Function




Private Sub Command1_Click()
Dim byt() As Byte
byt = UnicodeToUtf8("测试")
Debug.Print Hex(byt(0)) & Hex(byt(1)) & Hex(byt(2))
Debug.Print Utf8ToUnicode(byt())
End Sub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GBK 和 UTF-8 是两种常见的字符编码方式,其中GBK 是一种支持中文字符的字符编码方式,适用于中文常用字符的存储和传输。而 UTF-8 则是一种通用的字符编码方式,不仅支持中文,还支持其他语言,并且可变长编码方式使得 UTF-8 比GBK 更加灵活。 如果需要将GBK 中的字符换为 UTF-8 编码方式,可以使用在线换工具实现。在线工具可以简单地将输入的字符换为 UTF-8 编码,并将输出文本呈现出来。这样就可以确保所有输入的字符都将正确地换为 UTF-8 编码方式,而无需自己手动进行编码换。 以换汉字“中文”为例,用户只需要将“中文”输入在线工具中的GBK 输入框中,然后点击换按钮即可。换完成后,用户可以看到“中文”对应的 UTF-8 编码,同时产生的输出文本也会显示为“中文”。 总的来说,借助在线的 GBK UTF-8 工具,用户可以轻松地将GBK 编码方式换为 UTF-8 编码方式,从而满足各种实际需求。 ### 回答2: GBK和UTF-8是常用的字符编码方式。GBK编码是中文字符集编码,包含中文汉字、拉丁字母等字符;而UTF-8是国际通用字符集编码,包含大部分世界上使用的字符。 当我们需要将GBK编码的文本换成UTF-8编码时,可以通过在线换工具完成。在线GBKUTF-8换工具具有操作简单、易用性强、无需下载安装等诸多优点。 首先,我们需要选择可靠的在线换工具,如在线换网或爱资料换工具等网站。然后,在网站上找到GBKUTF-8工具页面,将需要换的文本粘贴到输入框中,设置换选项,如换后换行、保留BOM、换格式等,最后点击“换”按钮即可得到UTF-8编码的文本。 需要注意的是,换时需要保证待换文本在原编码下已经正确,否则会导致换后的文本出现乱码等问题。另外,在使用在线换工具时,应注意避免换大量机密性或重要性文档,以免造成损失。 总之,通过在线GBKUTF-8换工具,我们可以轻松实现字符编码换,方便用户处理不同编码格式的文本。 ### 回答3: GBK和UTF-8是两种字符编码方式,GBK主要用于中文字符集,而UTF-8则是一种可变长度的Unicode编码,可以表示世界上所有语言字符。由于互联网的普及,现在越来越多的网站都采用UTF-8编码。 如果在网站制作过程中,遇到GBK编码的网页需要换为UTF-8编码,有两种方法可以实现。一种是手动换,需要开发者将所有的文本复制到文本编辑器中,将编码格式从GBK换为UTF-8,再将文本复制到网页中保存。 另外一种方法是使用在线工具进行换,例如常用的GBKUTF-8在线换工具。使用这种方法可以大大减少手动操作,让换更加便捷和快速。 使用在线工具进行字符编码换的步骤非常简单,只需要将需要换的文件上传到工具中,然后选择需要的换方式,这里选择GBKutf-8编码。接下来只需要等待换完成即可,换后的文件可以直接下载保存到本地。 总之,使用GBKUTF-8在线换工具可以大大缩短时间,提高工作效率,在线换工具也保证了数据的安全性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值