-
Notifications
You must be signed in to change notification settings - Fork 210
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
编码简介:utf8,utf16以及其它 #4
Comments
code point: 码位 UTF-16UTF-16 (16-bit Unicode Transformation Format) 是Unicode字符编码五层次模型的第三层:字符编码表(Character Encoding Form,也称为"storage format")的一种实现方式。即把Unicode字符集的抽象码位映射为16位长的整数(即码元)的序列,用于数据存储或传递。Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。 Unicode的编码空间从U+0000到U+10FFFF,共有1,112,064个码位(code point)可用来映射字符。Unicode的编码空间可以划分为17个平面(plane),每个平面包含216(65,536)个码位。17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从00(16进制)到10(16进制),共计17个平面。第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0)。其他平面称为辅助平面(Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区块是永久保留不映射到Unicode字符。UTF-16就利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码。 编码规则U+0000 ~ U+D7FF 和 U+E000 ~ U+FFFF这个范围即基本多语言平面(Basic Multilingual Plane, BMP),包含了最常用的字符,包含的码位范围是U+0000 到 U+FFFF,只需要一个16位的码元即可表示。 U+10000 ~ U+10FFFF其它平面(叫做辅助平面,Supplementary Planes)中的码位,在UTF-16中被编码为一对16位长的码元(即32bit,4Bytes),称作代理对(surrogate pair),具体方法是:
由于高位代理比低位代理的值要小,所以为了避免混淆使用,Unicode标准现在称高位代理为前导代理(lead surrogates),低位代理为后尾代理(trail surrogates)。 上述算法可理解为:辅助平面中的码位从U+10000到U+10FFFF,共计FFFFF个,即2^20=1,048,576个,需要20位来表示。如果用两个16位长的整数组成的序列来表示,第一个整数(称为前导代理)要容纳上述20位的前10位,第二个整数(称为后尾代理)容纳上述20位的后10位。还要能根据16位整数的值直接判明属于前导整数代理的值的范围(2^10=1024),还是后尾整数代理的值的范围(也是2^10=1024)。因此,需要在基本多语言平面中保留不对应于Unicode字符的2048个码位,就足以容纳前导代理与后尾代理所需要的编码空间。这对于基本多语言平面总计65536个码位来说,仅占3.125%. 由于前导代理、后尾代理、BMP中的有效字符的码位,三者互不重叠,搜索是简单的:一个字符编码的一部分不可能与另一个字符编码的不同部分相重叠。这意味着UTF-16是自同步(self-synchronizing):可以通过仅检查一个码元就可以判定给定字符的下一个字符的起始码元。UTF-8也有类似优点,但许多早期的编码模式就不是这样,必须从头开始分析文本才能确定不同字符的码元的边界。 U+D800 ~ U+DFFFUnicode标准规定U+D800..U+DFFF的值不对应于任何字符。 但是在使用UCS-2的时代,U+D800..U+DFFF内的值被占用,用于某些字符的映射。 UTF-16与UCS-2的关系UTF-16来源于UCS-2 。在1980年代末,人们希望为世界上所有字符(Universal Character Set--UCS)开发一个统一的编码。最初的目标是扩展8位的ascii码为16位比特(216 = 65,536)。可惜,很快16位被证明不足够包括所有字符,共同开发UCS的IEEE和Unicode Consortium产生分歧:IEEE引入固定32位比特来编码字符(UCS-4),Unicode Consortium推出UTF-16。 UTF-16可看成是UCS-2的父集。在没有辅助平面字符(surrogate code points)前,UTF-16与UCS-2所指的是同一的意思。但当引入辅助平面字符后,就称为UTF-16了。现在若有软件声称自己支持UCS-2编码,那其实是暗指它不能支持在UTF-16中超过2字节的字集。对于小于0x10000的UCS码,UTF-16编码就等于UCS码。 |
ASCII 与 ISO-8859-1ASCII码是最基础的编码,共定义了128个字符(0-127)。这些字符分为控制字符和可显示字符(26个基本拉丁字母、阿拉伯数目字和英式标点符号)。 ASCII使用了8位2进制,但最高位始终为0,并没有有效利用。而最高位置1,在空置的0xA0-0xFF的范围内,加入96个字母及符号,用以供使用附加符号的拉丁字母语言使用——这就是
另外,结合UTF8定义,可以看到,UTF8并没有兼容 |
从
|
UTF-8
UTF-8(8-bit Unicode Transformation Format) 是一种针对Unicode的可变长度字元编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字元,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字元的软件无须或只须做少部分修改,即可继续使用。
UTF-8使用一至六个字节为每个字符编码(尽管如此,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节)。
编码规则
Unicode字元的比特被分区为数个部分,并分配到UTF-8的字节串中较低的比特的位置。在U+0080的以下字元都使用内含其字元的单字节编码。这些编码正好对应7比特的ASCII字符。在其他情况,有可能需要多达4个字元组来表示一个字元。这些多字节的最高有效比特会设置成1,以防止与7比特的ASCII字符混淆,并保持标准的字节主导字符串运作顺利。
以实例来解释utf8编码:
规范更新
2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF。根据规范,以下字节值将无法出现在合法UTF-8序列中:
代码实现转换UTF8编码的Bytes为字符串
代码中看出需要注意2点:
0xEF,0xBB,0xBF
是 BOM(Byte order mark),UTF8编码允许BOM存在,但不依赖也不推荐使用BOM。不能正确识别BOM时,就会输出
。The text was updated successfully, but these errors were encountered: