- 浏览: 205429 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xiegqooo:
fbb_11 写道如果以前都正常,而突然不正常了,正常的思路应 ...
思考才能有效的解决问题----<WEB应用在捕捉异常并处理时,请不要使用System.exit(1)!!!! > -
ilotuo:
Nice! Thank for sharing your ex ...
Ogre xcode build error: Reference to 'FileInfo' is ambiguous -
Stark_Summer:
赞 就是感觉过于概念了。还是不能很明白
ANSI和Unicode中的汉字编码 (转) -
landerson:
旧版的ANTTASK.JAR与新版的ANT-TASK.JAR ...
ant 优化android 项目编译第二波,simple编译项目只需1分钟 -
luopenger:
taskdef com.android.ant.SetupTa ...
使用ant优化android项目编译速度,提高工作效率
一, 最重要的,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
发表评论
-
Mac OS X Lion Eclipse JDK JRE Not found problem(Solved)
2012-03-15 11:26 3081the origin page from http://sta ... -
Oracle 多行转列方法
2011-08-09 16:20 1033Creating a comma-separated list ... -
Using the Spring Security Facelets Tag Library
2011-06-29 16:16 967http://static.springsource.org/ ... -
Don't repeat DAO
2011-06-29 11:17 836http://www.ibm.com/developerwor ... -
GenericDao class
2011-06-29 10:49 888public class PersistenceManager ... -
Object to genericty
2011-06-28 11:56 852public T getGenericity(Object o ... -
JAVA专用术语中英文对照
2011-06-20 09:56 926一群性质相近同的「东西」,如果译名一贯,阅读的感觉就很好。 一 ... -
ANSI和Unicode中的汉字编码 (转)
2010-11-12 20:49 9539ANSI:汉字区的内码范围高字节从B0-F7,低字节从A1 ... -
思考才能有效的解决问题----<WEB应用在捕捉异常并处理时,请不要使用System.exit(1)!!!! >
2010-10-11 17:55 4717思考才能有效的解决问 ... -
同步的本质
2010-10-07 17:10 787同步的本质 首先我们得明白操作系统是如何执行程序的。对 ... -
多线程使用数据库连接池JDCconectionPool造成内存泄露 OutOfMemoryException 原因及解决
2010-10-04 21:59 1748最近在写一个多线程的任务队列应用,由于有大量的对数据库 ... -
内存泄露与溢出区别
2010-10-03 21:07 899下面,我们就可以描述什么是内存泄漏。在Java中,内存泄漏就是 ... -
向大家强烈推荐 NetBeans Profiler查找内存泄漏
2010-10-03 18:16 1292向大家强烈推荐 NetBeans Profiler查找内存泄 ... -
使用多线程完成任务队列造成内存泄露
2010-10-03 18:11 0最近在写一个多线程的任务队列应用,当运行程序大概两个小时左 ... -
Java堆.栈和常量池<转>
2010-10-03 18:02 897Java内存分配: 1. 寄存器 ... -
java 线程Thread.Sleep详解 <转帖>
2010-09-19 14:06 1526我们可能经常会用 ... -
追MM与Java的23种设计模式
2010-09-14 15:55 773http://hi.baidu.com/rtsbtx/blog ... -
JAVA 单例模式与多线程
2010-09-14 15:53 1143单例模式单例模式是一种常见的设计模式, 单例模式分三种:懒汉式 ... -
MyJxta2.5研究心得 (2009-07-24)
2010-08-25 16:19 1715MyJxta2.5研究心得 (2009-07 ...
相关推荐
最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。
最近在用的资料,第一次传资料,试试~呵呵~不知道对大家有用没
这是本人在工作中碰到的问题,通过网上搜索资料和自我学习通过自己的代码实现了linux/嵌入式linux中最常见的GB2312转UTF-8的需要,里面有GB2312转UNICODE编码表的源码和UNICODE转UTF-8的转换方法的源码实现及分析...
在做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 改进列表:2014-01-27 1、修正所有已知的BUG及系统高危漏洞. 2、优化监听器模块 3、新增文档模块及文档调用标签 4、优化RSS模块 5、新增播放地址预处理接口(pv_...
一个利用iconv函数将GBK码转为UTF-8码的函数,本函数在LINUX系统下测试正常。目前支持中文繁简、日文、英文、俄文等的转码。函数其实很简单,另外精选了一些本人觉得有助于理解ICONV函数及Unicode、GBK这些概念的...
主要介绍了Android UTF-8转码实例详解的相关资料,需要的朋友可以参考下
PHPvod视频点播系统 2.6 for php5.3.x utf-8 系统改进列表:2014-01-27 1、修正所有已知的BUG及系统高危漏洞. 2、优化监听器模块 3、新增文档模块及文档调用标签 4、优化RSS模块 5、新增播放地址预处理接口(pv...
查了很多资料,总结一份这三个类型互转的函数,语言用c语言写,工程用visual studio写的,没有的话把相关c文件复制出来用就好
4、个人资料进行了新的调整,UCH原个人资料中的学校、工作信息将需要重新填写; 5、UCH的全站实名功能不再支持; Discuz! X1.0中并未具备SupeSite 7.5中的全部功能, 此转换程序,仅转换SupeSite 7.5中的资讯...
修正 专题系统"小挂件"图片不能正常显示的问题 修正 抽奖系统用户参与次数无效的问题 修正 JSON 转换时在 UTF8 编码下出错的问题 修正 金币竞拍若干问题,涉及二级域名,金币数量和样式等等 修正 金币竞拍倒计时计算...
提供简体,不久还会随(UCenter)支持繁体、UTF-8简体、UTF-8繁体共四种语言版本,方便不同地区用户使用。 无论是播放器水印、站外引用的Logo,还是播放器的内外链接,都与站长域名一致。 独特的站外引用机制,...
Python中的编码和解码 Python中提供了多种编码和解码方式,包括ASCII、UTF-8、GBK等。其中,ASCII是最基本的编码方式,只能表示128个字符,包括英文字母、数字和一些特殊字符。而UTF-8则是一种更加通用的编码方式,...
计算机基础知识-编码表 模块:计算机基础知识 主题:编码表 关键词:ASCII、Unicode、UTF-8 1、编码表 计算机发明之初,用来解决数字计算的问题,后来人们发现可以做更多的事,但由 于计算机只识" 数",因此人们必须...
职员自助服务和职员工资 包括一套新的顾客自助服务模块,它提供了客户服务中心和顾客研读总帐报表等功能,安装过程被改进,对中文 egroupware 用户来说,zh/zt 被转换到 utf-8 的功能被加入
后来查找相关资料,得知Expat不支持gb2312编码格式,主要支持UTF-8编码格式。然而我们在程序中传递数据时,往往是用的gb2312格式文本的,于是想找出办法解决之,想到两种办法: 1、改写Expat源代码,这样效率高,但...
* charsetName:字符集名 例如 : "GBK"、"UTF-8" 、"ISO-8859-1" * * 不常用 * 3.String(byte[] bytes) 根据默认字符集将字节数组转换为字符串 * 4.String(byte[] bytes, String ...
python_seed128 Python种子_128 这是一个 Python 文件,其输出与 KISA 提供的 seed... 在实际的API通信中,主要是将字节流以utf-8编码后发送,在这个过程中,先转换为utf-16(\x0000~\xFFFF),然后再编码为utf-8。
在使用Pyserial与STM32进行通讯时,遇到了...# -*- coding: utf-8 -*- import binascii #16进制整数转ASCii编码字符串 a = 0x665554 b = hex(a) #转换成相同的字符串即'0x665554' b = b[2:] #截取掉'0x' c = binascii