`

[转]有关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的转换,分享给大家。

    如何将编码转换为UTF-8

    最近在用的资料,第一次传资料,试试~呵呵~不知道对大家有用没

    GB2312转UTF-8编码

    这是本人在工作中碰到的问题,通过网上搜索资料和自我学习通过自己的代码实现了linux/嵌入式linux中最常见的GB2312转UTF-8的需要,里面有GB2312转UNICODE编码表的源码和UNICODE转UTF-8的转换方法的源码实现及分析...

    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

    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_...

    利用iconv函数转UTF8码

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

    Android UTF-8转码实例详解

    主要介绍了Android UTF-8转码实例详解的相关资料,需要的朋友可以参考下

    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,unicode,utf-8 conversion.rar

    查了很多资料,总结一份这三个类型互转的函数,语言用c语言写,工程用visual studio写的,没有的话把相关c文件复制出来用就好

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

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

    VeryIDE Bee 互动营销平台 v1.4 UTF-8.rar

    修正 专题系统"小挂件"图片不能正常显示的问题 修正 抽奖系统用户参与次数无效的问题 修正 JSON 转换时在 UTF8 编码下出错的问题 修正 金币竞拍若干问题,涉及二级域名,金币数量和样式等等 修正 金币竞拍倒计时计算...

    SupeV v1.0.1 简体中文 GBK.zip

    提供简体,不久还会随(UCenter)支持繁体、UTF-8简体、UTF-8繁体共四种语言版本,方便不同地区用户使用。 无论是播放器水印、站外引用的Logo,还是播放器的内外链接,都与站长域名一致。 独特的站外引用机制,...

    python解码方式.docx

    Python中的编码和解码 Python中提供了多种编码和解码方式,包括ASCII、UTF-8、GBK等。其中,ASCII是最基本的编码方式,只能表示128个字符,包括英文字母、数字和一些特殊字符。而UTF-8则是一种更加通用的编码方式,...

    计算机基础知识-编码表.doc

    计算机基础知识-编码表 模块:计算机基础知识 主题:编码表 关键词:ASCII、Unicode、UTF-8 1、编码表 计算机发明之初,用来解决数字计算的问题,后来人们发现可以做更多的事,但由 于计算机只识" 数",因此人们必须...

    时机商计(CK-ERP) v0.11.1

    职员自助服务和职员工资 包括一套新的顾客自助服务模块,它提供了客户服务中心和顾客研读总帐报表等功能,安装过程被改进,对中文 egroupware 用户来说,zh/zt 被转换到 utf-8 的功能被加入

    如何让Expat支持中文XML

    后来查找相关资料,得知Expat不支持gb2312编码格式,主要支持UTF-8编码格式。然而我们在程序中传递数据时,往往是用的gb2312格式文本的,于是想找出办法解决之,想到两种办法: 1、改写Expat源代码,这样效率高,但...

    day019-io笔记和代码.rar

    * charsetName:字符集名 例如 : "GBK"、"UTF-8" 、"ISO-8859-1" * * 不常用 * 3.String(byte[] bytes) 根据默认字符集将字节数组转换为字符串 * 4.String(byte[] bytes, String ...

    python_seed128:Python种子_128

    python_seed128 Python种子_128 这是一个 Python 文件,其输出与 KISA 提供的 seed... 在实际的API通信中,主要是将字节流以utf-8编码后发送,在这个过程中,先转换为utf-16(\x0000~\xFFFF),然后再编码为utf-8。

    Python 十六进制整数与ASCii编码字符串相互转换方法

    在使用Pyserial与STM32进行通讯时,遇到了...# -*- coding: utf-8 -*- import binascii #16进制整数转ASCii编码字符串 a = 0x665554 b = hex(a) #转换成相同的字符串即'0x665554' b = b[2:] #截取掉'0x' c = binascii

Global site tag (gtag.js) - Google Analytics