UTF-16[转]

UTF-16是Unicode的其中一个使用方式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。

它定义于ISO/IEC 10646-1的附录Q,而RFC2781也定义了相似的做法。

在Unicode基本多文种平面定义的字符(无论是拉丁字母、汉字或其他文字或符号),一律使用2字节储存。而在辅助平面定义的字符,会以代理对(surrogate pair)的形式,以两个2字节的值来储存。

UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。

UTF-16的编码模式

UTF-16的大尾序和小尾序储存形式都在用。一般来说,以Macintosh制作或储存的文字使用大尾序格式,以Microsoft或Linux制作或储存的文字使用小尾序格式。

为了弄清楚UTF-16文件的大小尾序,在UTF-16文件的开首,都会放置一个U+FEFF字符作为Byte Order Mark (UTF-16LE 以 FF FE 代表,UTF-16BE 以 FE FF 代表),以显示这个文字档案是以UTF-16编码。

以下的例子有四个字符:“朱”、半角逗号、“聿”、“𨮁”。

使用 UTF-16 编码的例子
编码名称 编码次序 编码
UTF-16LE 小尾序 31 67, 2C 00, 7F 80, 62 D8 81 DF
UTF-16BE 大尾序 67 31, 00 2C, 80 7F, D8 62 DF 81
UTF-16 小尾序,包含BOM FF FE, 31 67, 2C 00, 7F 80, 62 D8 81 DF
UTF-16 大尾序,包含BOM FE FF, 67 31, 00 2C, 80 7F, D8 62 DF 81

UTF-16 与 UCS-2 的关系

UTF-16可看成是UCS-2的父集。在没有辅助平面字符前,UTF-16与UCS-2所指的是同一的意思。但当引入辅助平面字符后,就只称为UTF-16了。现在若有软件声称自己支援UCS-2编码,那其实是暗指它不能支援辅助平面字符的委婉语

=====================================================================
关于utf-8和unicode的一点理解[转]

ANSI与ASCII

最初,Internet上只有一种字符集——ANSI的ASCII字符集(American Standard Code for Information Interchange, “美国信息交换标准码),它使用7 bits来表示一个字符,总共表示128个字符,后来IBM公司在此基础上进行了扩展,用8bit来表示一个字符,总共可以表示256个字符,充分利用了一个字节所能表达的最大信息
ANSI字符集:ASCII字符集,以及由此派生并兼容的字符集,如:GB2312,正式的名称为MBCS(Multi-Byte Chactacter System,多字节字符系统),通常也称为ANSI字符集。


UNICODE与UTF8,UTF16

由于每种语言都制定了自己的字符集,导致最后存在的各种字符集实在太多,在国际交流中要经常转换字符集非常不便。因此,产生了Unicode字符集,它固定使用16 bits(两个字节)来表示一个字符,共可以表示65536个字符
n标准的Unicode称为UTF-16(UTF:UCS Transformation Format )。后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。(Unicode字符集有多种编码形式)
为什么还要有UTF-8?
毕竟互联网70%以上的信息仍然是英文。如果连英文都用2个字节存取(UCS-2),空间浪费不就太多了?所谓UTF-8就是这样一个为了提高英文存取效率的字符集转换格式:Unicode Transformation Form 8-bit form。用UTF-8,UNICODE的2字节字符用变长个(1-3个字节)表示:

对英文,仍然和ASCII一样用1个字节表示,这个字节的值小于128(\x80);
对其他语言的用一个值位于128-256之间的字节开始,再加后面紧跟的2个字节表示,一个字符一共是3个字节;

因此,在应用中程序处理过程中所有字符都是16位(双字节),但在存取转换成字节流时使用UTF-8格式转换,对于英文字符来说和原来用ASCII方式存取时相比大小仍然是一样的,而对中文来说和原来的GB2312编码方式相比,大小为:(3字节/2字节)=1.5倍
 例如“连通”两个字的Unicode标准编码UTF-16 (big endian)为:DE 8F 1A 90
                 而其UTF-8编码为:E8 BF 9E E9 80 9A

 
当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。软件一般采用三种方式来决定文本的字符集和编码:
检测文件头标识,提示用户选择,根据一定的规则猜测
最标准的途径是检测文本最开头的几个字节,开头字节 Charset/encoding,如下表:
EF BB BF    UTF-8
FE FF     UTF-16/UCS-2, little endian
FF FE     UTF-16/UCS-2, big endian
FF FE 00 00   UTF-32/UCS-4, little endian.
00 00 FE FF   UTF-32/UCS-4, big-endian.


重要:但是早期的一些软件并没有自动给文件添加这些头部,这样会导致程序需要”猜“是什么编码,但是notepad会认为ansi方式下存的文件更象一个utf-8的,于是用utf-8来解析这个文件,这样会导致“联通”不能显示

 

 

posted @ 2008-01-10 17:32  IamV  阅读(1391)  评论(0编辑  收藏  举报