- 浏览: 214372 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 3145the origin page from http://sta ... -
Oracle 多行转列方法
2011-08-09 16:20 1077Creating a comma-separated list ... -
Using the Spring Security Facelets Tag Library
2011-06-29 16:16 1026http://static.springsource.org/ ... -
Don't repeat DAO
2011-06-29 11:17 994http://www.ibm.com/developerwor ... -
GenericDao class
2011-06-29 10:49 935public class PersistenceManager ... -
Object to genericty
2011-06-28 11:56 916public T getGenericity(Object o ... -
JAVA专用术语中英文对照
2011-06-20 09:56 1003一群性质相近同的「东西」,如果译名一贯,阅读的感觉就很好。 一 ... -
ANSI和Unicode中的汉字编码 (转)
2010-11-12 20:49 9680ANSI:汉字区的内码范围高字节从B0-F7,低字节从A1 ... -
思考才能有效的解决问题----<WEB应用在捕捉异常并处理时,请不要使用System.exit(1)!!!! >
2010-10-11 17:55 4780思考才能有效的解决问 ... -
同步的本质
2010-10-07 17:10 855同步的本质 首先我们得明白操作系统是如何执行程序的。对 ... -
多线程使用数据库连接池JDCconectionPool造成内存泄露 OutOfMemoryException 原因及解决
2010-10-04 21:59 1799最近在写一个多线程的任务队列应用,由于有大量的对数据库 ... -
内存泄露与溢出区别
2010-10-03 21:07 941下面,我们就可以描述什么是内存泄漏。在Java中,内存泄漏就是 ... -
向大家强烈推荐 NetBeans Profiler查找内存泄漏
2010-10-03 18:16 1358向大家强烈推荐 NetBeans Profiler查找内存泄 ... -
使用多线程完成任务队列造成内存泄露
2010-10-03 18:11 0最近在写一个多线程的任务队列应用,当运行程序大概两个小时左 ... -
Java堆.栈和常量池<转>
2010-10-03 18:02 966Java内存分配: 1. 寄存器 ... -
java 线程Thread.Sleep详解 <转帖>
2010-09-19 14:06 1579我们可能经常会用 ... -
追MM与Java的23种设计模式
2010-09-14 15:55 811http://hi.baidu.com/rtsbtx/blog ... -
JAVA 单例模式与多线程
2010-09-14 15:53 1209单例模式单例模式是一种常见的设计模式, 单例模式分三种:懒汉式 ... -
MyJxta2.5研究心得 (2009-07-24)
2010-08-25 16:19 1755MyJxta2.5研究心得 (2009-07 ...
相关推荐
最近需要对Linux与Windows平台下的字符传输出现乱码,对...参考了网上的UTF-8/UTF-16转换的资料,只有0x10000以下的Unicode编码进行了转换;对其代码进行了修改和补充,可以实现所有的UTF-8/UTF-16的转换,分享给大家。
本资料包"VB GB2312 转UTF-8的函数.zip"提供了将GB2312编码转换为UTF-8编码的函数,这对于处理多语言或者历史遗留的GB2312编码的文本数据尤为关键。 GB2312(中国国家标准简体中文字符集)是一种针对中文的双字节...
### Java程序转码(UTF-8):详细解析与实现 #### 一、引言 在处理文本数据时,字符编码是一项重要的技术基础。不同系统、不同语言环境下的字符编码可能不一致,这就需要进行字符编码转换以确保数据正确显示和处理...
本文将深入探讨"豆葵GB-BIG5-UTF-8 文件编码批量转换工具"的相关知识点。 首先,我们要了解编码的基础知识。字符编码是用来表示文本的数字表示方式,常见的有ASCII、GB2312、GBK、BIG5和UTF-8等。ASCII是最基础的7...
在做Labview和tcp通讯的时候,需要发送中文字符串,找了会相关资料,竟然找到了labview提供...原文https://forums.ni.com/t5/LabVIEW/undocumented-function-quot-text-to-utf-8-quot/td-p/512911?profile.language=en
这篇文章会详细介绍如何使用Go语言将GBK编码的字符串转换为UTF-8编码的例子,这是一个在中文数据处理中常见的转换案例。 首先,了解GBK和UTF-8的基本概念。GBK编码是一种汉字内码,支持简体中文字符,是GB2312的...
该版本发布于2010年12月26日,采用UTF-8编码,确保了跨平台和多语言支持,是程序员和开发者们宝贵的参考资料。 1. **商业源码的理解**: 商业源码是指软件公司或个人开发者为了商业目的而编写的源代码,它是软件的...
在本项目中,"utf8转换"意味着代码会包含将数据从其他编码格式转换为UTF-8或从UTF-8转换为其他格式的逻辑。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析...
描述中的"RFC2253分辨名的UTF-8字符串表示法中文版"与标题相呼应,强调了文档的中文特性,意味着这个资料可能是为中文读者提供的,帮助他们理解原本可能用英文编写的RFC2253标准,特别是关于DNs如何用UTF-8编码的...
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(Active Server Pages)作为服务器端脚本语言,与ACCESS数据库结合,...
压缩包中的"lelelucky_v1.2_utf-8"很可能包含了插件的源代码、配置文件、示例项目以及帮助文档等资源,用户可以根据这些资料进行安装和定制。在使用过程中,参照CHM手册可以解决大部分操作问题,对于高级开发者来说...
在处理Oracle数据库中使用DBMS_XMLDOM模块创建并导出XML文档时,经常会遇到有关文档编码格式的问题,尤其是如何确保导出的XML文档采用UTF-8编码格式。本文将对这一问题进行详细的探讨,并提供解决方法。 #### 问题...
一个利用iconv函数将GBK码转为UTF-8码的函数,本函数在LINUX系统下测试正常。目前支持中文繁简、日文、英文、俄文等的转码。函数其实很简单,另外精选了一些本人觉得有助于理解ICONV函数及Unicode、GBK这些概念的...
PHPvod视频点播系统 2.6 for php5.3.x utf-8 系统改进列表:2014-01-27 1、修正所有已知的BUG及系统高危漏洞. 2、优化监听器模块 3、新增文档模块及文档调用标签 4、优化RSS模块 5、新增播放地址预处理接口(pv...
于是查阅了相关资料,对于java开发来说,使用文件流就很轻松解决这个问题,首先最重要是备份一下项目,然后把该工具文件随便丢到哪个地方,运行main函数,输入文件位置和初始编码以及要转换的编码就ok了。...
这个压缩包“ASP.NET源码——PHPWind For DVBBS Forums 2.0 简体中文 utf-8 正式版.zip”提供了一个基于ASP.NET实现的PHPWind论坛的源代码,适用于DVBBS论坛的升级或转型。 首先,ASP.NET是由微软公司开发的服务器...
这个UTF-8格式的压缩包包含了书中介绍的各种设计模式的实现,是学习和研究设计模式的重要参考资料。 设计模式是软件工程中的宝贵经验总结,它是在特定上下文中解决常见问题的最佳实践。通过学习和运用设计模式,...
对于ASCII字符(包含英文、数字和一些符号),UTF-8编码与ASCII编码完全相同,都是用单个字节表示,而其他语言如中文、日文等非ASCII字符则使用多个字节。 在"HghEncoding.cpp"和"HghEncoding.h"这两个源文件中,...
4、个人资料进行了新的调整,UCH原个人资料中的学校、工作信息将需要重新填写; 5、UCH的全站实名功能不再支持; Discuz! X1.0中并未具备SupeSite 7.5中的全部功能, 此转换程序,仅转换SupeSite 7.5中的资讯...