1.字符集vs字符编码,编码&解码

Character----->code point----->bytes
前两者字符集的关系,可以统称为codepoint;从codepoint到在计算机上的存储形式,称为编码,反过来称为解码;
字符集:单个符号(character)对应一个无符号数字(通常16进制表示,称为代码点code point),这种对应关系称为字符集
字符编码:代码点与二进制的对应关系称为字符编码,内存或磁盘存储数据的形式为二进制

2.历史:UCS-2(两个字节定长编码)---USC-4,UTF-32(四个字节定长编码)----UTF-16------UTF-8

我国发布的:GB2312---GBK(GB2312的扩展)

3.GB2312:两个字节表示字符码

             兼容ASCII
             一个字节中的1位区分,1表示GB2312字符集,0表示ASCII字符集
             最多可以表示94*94个字符,留有一部分扩展
             编码主要是EUC-CN,兼容ASCII

4.Unicode:4个字节表示

UTF-8,UTF-16,变长编码
    UTF-16,两个字节变长编码(2,4)
    UTF-8,(1,2,3,4)
UTF-32,定长编码(4字节)

5.BMP:

Unicode 标识符通过一个明确的名字和一个整数来作为它的码位(code point).比如,“©” 字符的码位可以用“版权标志”和U+00A9(0xA9,也可以写作十进制 169)来表示。
Unicode 字符分为 17 组平面,每个平面拥有 2^16 (65,536)个码位.有一些码位没有分配字符,也有一些码位被保留,成为私有的,也有一些码位是永远被保留的,作为无字符的标志。每一个码位都可以用 16 进制 xy0000 到 xyFFFF 来表示,这里的 xy 是表示一个 16 进制的值,从 00 到 10。
这第一个位置(当 xy 是 00 的时候)被称为 BMP (基本多文种平面, Basic Multilingual Plane)。它包含了最常用的码位从 U+0000 到 U+FFFF。

6.JS的UTF-16(历史遗留问题,JS选用UTF-16):http://developer.51cto.com/ar...

两个字节为一个单元,LENGTH为1

7.BOM(BYTE ORDER MARK)

UTF-16 (BE)    FE FF    254 255      big endian 大端
UTF-16 (LE)    FF FE    255 254  little endian 小端


UTF-16 与 UTF-32 还有一个不明显的缺点。我们知道不同的计算机存储字节的顺序是不一样的,这也就意味着U+4E2D 在 UTF-16 可以保存为4E 2D,也可以保存成2D 4E,这取决于计算机是采用大端模式还是小端模式,UTF-32 的情况也类似。为了解决这个问题,引入了 BOM (Byte Order Mark),它是一特殊的不可见字符,位于文件的起始位置,标示该文件的字节序。对于 UTF-16 来说,BOM 为U+FEFF(FF 比 FE 大 1),如果 UTF-16 编码的文件以FF FE开始,那么就意味着其字节序为小端模式,如果以FE FF开始,那么就是大端模式。
其他 UTF-* 编码的 BOM 可以参考 Representations of byte order marks by encoding

8.UTF-8,UTF-16,UTF-32的选择:

1)不考虑随机访问,UTF-8,查找第N个字符时间复杂度(O(N))
2)随机访问,只用65535之内的字符,UTF-16,时间复杂度(O(1))
3)随机访问,超过了65535,UTF-32,O(1)

9.详解UTF-8编码

clipboard.png


_ipo
179 声望15 粉丝

bug