关于”unicode字符是2个字节“这句话的讨论
2016-02-26 13:58
169 查看
很多人,即使是有一些项目经验的人,都说过这句话。但是如果深入的理解什么是unicode之后就会知道,原来我们经常说的这句话“unicode字符是2个字节”这句话是有问题的。
要说清楚这个问题,首先就要说清楚unicode到底是什么。
unicode是一个标准,也可以说是世界上的语言字符和数字映射的一种标准。它没有限制字符的数量,但是可能这个标准规定的映射只是映射了一部分字符。每个字符映射一个code point(码点)。Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。
所以Unicode支持的字符上限是65536个
这句话也是有问题的,这65536个字符是我们最常用的基本字符,但是还有很多字符是在0x0000--0xFFFF之外的。在我们说unicode是几个字节这句话的时候,就已经暗示了我们现在讨论的是unicode在计算机内存里的存储方式了(只有在计算机系统里才有字节这种定义,如果脱离计算机的话unicode是不会与字节扯上关系的)。unicode存储在计算机内存里肯定是需要编码的,那么就有UTF-8,UTF-16,UTF-32等编码方案。为什么我们常说“unicode字符是2个字节”,是因为windows默认的unicode编码就是UTF-16。而unicode在这种编码下,大部分都是2个字节的,至少上面提到的前65536个基本常用字符都是2个字节的。所以就有了“unicode字符是2个字节”这句话。其实UTF-16是一种变长的编码方案,有些unicode字符的抽象码点(code
point)编码后是2个字节,有些是4个字节。所以“unicode字符是2个字节”这句话大多数时候是正确的,但是unicode字符的抽象码点(code
point)超过范围0x0000--0xFFFF后就不对了。
如果是为了跨平台兼容性,只需要知道,在 Windows 记事本的语境中:
所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码。
所谓的「Unicode」指的是带有 BOM 的小端序 UTF-16。
所谓的「UTF-8」指的是带 BOM 的 UTF-8。
下面是关于上面windows语境的一些词语的解释:
1.BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。
2.「UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF。
所以在谈及unicode的编码方案时是离不开计算机的微处理器的(决定字节顺序,是大端还是小端),以及操作系统(比如windows默认的上述语境:unicode指UTF-16).
注意:编码的目的在于在计算机系统里利于存储(减少空间占用),在网络传输里利于传输(减少数据量,不用考虑字节顺序的问题等)。其实就是把抽象的东西,编码成10等二进制字节流,并且尽量的减少内存空间的占用和网络传输时带宽的占用。
要说清楚这个问题,首先就要说清楚unicode到底是什么。
unicode是一个标准,也可以说是世界上的语言字符和数字映射的一种标准。它没有限制字符的数量,但是可能这个标准规定的映射只是映射了一部分字符。每个字符映射一个code point(码点)。Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。
所以Unicode支持的字符上限是65536个
这句话也是有问题的,这65536个字符是我们最常用的基本字符,但是还有很多字符是在0x0000--0xFFFF之外的。在我们说unicode是几个字节这句话的时候,就已经暗示了我们现在讨论的是unicode在计算机内存里的存储方式了(只有在计算机系统里才有字节这种定义,如果脱离计算机的话unicode是不会与字节扯上关系的)。unicode存储在计算机内存里肯定是需要编码的,那么就有UTF-8,UTF-16,UTF-32等编码方案。为什么我们常说“unicode字符是2个字节”,是因为windows默认的unicode编码就是UTF-16。而unicode在这种编码下,大部分都是2个字节的,至少上面提到的前65536个基本常用字符都是2个字节的。所以就有了“unicode字符是2个字节”这句话。其实UTF-16是一种变长的编码方案,有些unicode字符的抽象码点(code
point)编码后是2个字节,有些是4个字节。所以“unicode字符是2个字节”这句话大多数时候是正确的,但是unicode字符的抽象码点(code
point)超过范围0x0000--0xFFFF后就不对了。
如果是为了跨平台兼容性,只需要知道,在 Windows 记事本的语境中:
所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码。
所谓的「Unicode」指的是带有 BOM 的小端序 UTF-16。
所谓的「UTF-8」指的是带 BOM 的 UTF-8。
下面是关于上面windows语境的一些词语的解释:
1.BOM(byte order mark)是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,但这样的文件在 Windows 之外的操作系统里会带来问题。
2.「UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF。
所以在谈及unicode的编码方案时是离不开计算机的微处理器的(决定字节顺序,是大端还是小端),以及操作系统(比如windows默认的上述语境:unicode指UTF-16).
注意:编码的目的在于在计算机系统里利于存储(减少空间占用),在网络传输里利于传输(减少数据量,不用考虑字节顺序的问题等)。其实就是把抽象的东西,编码成10等二进制字节流,并且尽量的减少内存空间的占用和网络传输时带宽的占用。
相关文章推荐
- Linux 与 Windows 对UNICODE 的处理方式
- Unicode详细分析解释
- vbs中将GB2312转Unicode的代码
- 程序员趣味读物 谈谈Unicode编码
- 常用字符集编码详解(ASCII GB2312 GBK GB18030 unicode UTF-8)
- C#实现Json转Unicode的方法
- UTF-8、Unicode 标准化表单、BOM
- 浅谈Unicode与JavaScript的发展史
- JavaScript中字符串与Unicode编码互相转换的实现方法
- php utf-8转unicode的函数第1/2页
- php UTF-8、Unicode和BOM问题
- Unicode 编码转换器
- javascript下汉字和Unicode编码互转代码
- PHP如何实现Unicode和Utf-8编码相互转换
- PHP解码unicode编码的中文字符代码分享
- 浅析c++ 宏 #val 在unicode下的使用
- 简单谈谈php中的unicode和utf8编码
- 趣谈Unicode、Ascii、utf-8、GB2312、GBK等编码知识
- vbs实现unicode和ascii编码转换
- JavaScript语言对Unicode字符集的支持详解