`

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

    博客分类:
  • JAVA
阅读更多

一, 最重要的,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

分享到:
评论

相关推荐

    utf-8/utf-16转换代码完整版

    最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。

    VB GB2312 转UTF-8的函数.zip

    本资料包"VB GB2312 转UTF-8的函数.zip"提供了将GB2312编码转换为UTF-8编码的函数,这对于处理多语言或者历史遗留的GB2312编码的文本数据尤为关键。 GB2312(中国国家标准简体中文字符集)是一种针对中文的双字节...

    Java 程序转码(UTF-8)

    ### Java程序转码(UTF-8):详细解析与实现 #### 一、引言 在处理文本数据时,字符编码是一项重要的技术基础。不同系统、不同语言环境下的字符编码可能不一致,这就需要进行字符编码转换以确保数据正确显示和处理...

    豆葵GB-BIG5-UTF-8 文件编码批量转换工具

    本文将深入探讨"豆葵GB-BIG5-UTF-8 文件编码批量转换工具"的相关知识点。 首先,我们要了解编码的基础知识。字符编码是用来表示文本的数字表示方式,常见的有ASCII、GB2312、GBK、BIG5和UTF-8等。ASCII是最基础的7...

    Labview 字符串和UTF8的相互转换

    在做Labview和tcp通讯的时候,需要发送中文字符串,找了会相关资料,竟然找到了labview提供...原文https://forums.ni.com/t5/LabVIEW/undocumented-function-quot-text-to-utf-8-quot/td-p/512911?profile.language=en

    Golang GBK转UTF-8的例子

    这篇文章会详细介绍如何使用Go语言将GBK编码的字符串转换为UTF-8编码的例子,这是一个在中文数据处理中常见的转换案例。 首先,了解GBK和UTF-8的基本概念。GBK编码是一种汉字内码,支持简体中文字符,是GB2312的...

    商业源码-编程源码-Gart v1.3 utf-8 build 20101226.zip

    该版本发布于2010年12月26日,采用UTF-8编码,确保了跨平台和多语言支持,是程序员和开发者们宝贵的参考资料。 1. **商业源码的理解**: 商业源码是指软件公司或个人开发者为了商业目的而编写的源代码,它是软件的...

    Delphi XE + IdHTTPServer + utf8转换 + json解析(源码+测试可用)

    在本项目中,"utf8转换"意味着代码会包含将数据从其他编码格式转换为UTF-8或从UTF-8转换为其他格式的逻辑。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析...

    RFC2253分辨名的UTF-8字符串表示法中文版

    描述中的"RFC2253分辨名的UTF-8字符串表示法中文版"与标题相呼应,强调了文档的中文特性,意味着这个资料可能是为中文读者提供的,帮助他们理解原本可能用英文编写的RFC2253标准,特别是关于DNs如何用UTF-8编码的...

    PHPvod视频点播系统 2.6 for php5.2.x utf-8.rar

    PHPvod视频点播系统 2.6 for php5.2.x utf-8 改进列表:2014-01-27 1、修正所有已知的BUG及系统高危漏洞. 2、优化监听器模块 3、新增文档模块及文档调用标签 4、优化RSS模块 5、新增播放地址预处理接口(pv_...

    WEB进销存系统(ASP+ACCESS)UTF-8版

    【WEB进销存系统(ASP+ACCESS)UTF-8版】是一个基于Web的库存管理和销售追踪解决方案,专为中小企业设计,旨在提升业务运营效率。该系统利用ASP(Active Server Pages)作为服务器端脚本语言,与ACCESS数据库结合,...

    lelelucky网页通用抽奖插件UTF-8版本

    压缩包中的"lelelucky_v1.2_utf-8"很可能包含了插件的源代码、配置文件、示例项目以及帮助文档等资源,用户可以根据这些资料进行安装和定制。在使用过程中,参照CHM手册可以解决大部分操作问题,对于高级开发者来说...

    关于用oracle的dbms_xmldom导出xml文档编码格式UTF-8的问题总结

    在处理Oracle数据库中使用DBMS_XMLDOM模块创建并导出XML文档时,经常会遇到有关文档编码格式的问题,尤其是如何确保导出的XML文档采用UTF-8编码格式。本文将对这一问题进行详细的探讨,并提供解决方法。 #### 问题...

    利用iconv函数转UTF8码

    一个利用iconv函数将GBK码转为UTF-8码的函数,本函数在LINUX系统下测试正常。目前支持中文繁简、日文、英文、俄文等的转码。函数其实很简单,另外精选了一些本人觉得有助于理解ICONV函数及Unicode、GBK这些概念的...

    PHPvod视频点播系统 2.6 for php5.3.x utf-8.rar

    PHPvod视频点播系统 2.6 for php5.3.x utf-8 系统改进列表:2014-01-27 1、修正所有已知的BUG及系统高危漏洞. 2、优化监听器模块 3、新增文档模块及文档调用标签 4、优化RSS模块 5、新增播放地址预处理接口(pv...

    GBK转UTF-8, Java程序实现及使用

    于是查阅了相关资料,对于java开发来说,使用文件流就很轻松解决这个问题,首先最重要是备份一下项目,然后把该工具文件随便丢到哪个地方,运行main函数,输入文件位置和初始编码以及要转换的编码就ok了。...

    ASP.NET源码——PHPWind For DVBBS Forums 2.0 简体中文 utf-8 正式版.zip

    这个压缩包“ASP.NET源码——PHPWind For DVBBS Forums 2.0 简体中文 utf-8 正式版.zip”提供了一个基于ASP.NET实现的PHPWind论坛的源代码,适用于DVBBS论坛的升级或转型。 首先,ASP.NET是由微软公司开发的服务器...

    研磨设计模式-配套源代码 UTF-8格式

    这个UTF-8格式的压缩包包含了书中介绍的各种设计模式的实现,是学习和研究设计模式的重要参考资料。 设计模式是软件工程中的宝贵经验总结,它是在特定上下文中解决常见问题的最佳实践。通过学习和运用设计模式,...

    unicode_utf8.rar_UTF8

    对于ASCII字符(包含英文、数字和一些符号),UTF-8编码与ASCII编码完全相同,都是用单个字节表示,而其他语言如中文、日文等非ASCII字符则使用多个字节。 在"HghEncoding.cpp"和"HghEncoding.h"这两个源文件中,...

    Discuz! X1 繁体中文 UTF-8.zip

    4、个人资料进行了新的调整,UCH原个人资料中的学校、工作信息将需要重新填写; 5、UCH的全站实名功能不再支持; Discuz! X1.0中并未具备SupeSite 7.5中的全部功能, 此转换程序,仅转换SupeSite 7.5中的资讯...

Global site tag (gtag.js) - Google Analytics