Unicode

分别从 编码、存储、编程 三个方面描述对于 Unicode 的理解。

1. 编码:
Unicode 代表了一种编码方式,所有的字符,都用一个唯一的数字表示。Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。
ASCII 码: 美国指定的标准,规定了 英语字符 与 二进制位 的关系,规定了 0~127 所代表的英语字符,占 7 个 bit。
非 ASCII 码: 欧洲、亚洲等国家为了能够表示自己国家的字符,又要与 ASCII 码兼容,就需要使用 127 以上的数字来表示。
每个国家制订了自己的标准,但都与 ASCII 兼容。这样同一个数字,在不同国家的编码标准上很可能代表不同的意义。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel,在俄语编码中又会代表另一个符号。
Unicode 码:世界上存在着许多种编码方式,同一个二进制数字可以被解释成不同的符号。如果想要打开一个文件,就必须要知道它的编码方式,否则就会出现乱码。
所以就有了 Unicode, 它将世界上所有的符号都纳入其中,每一个符号都有独一无二的编码。

2. 存储:
Unicode 只规定了 数字 和 字符 之间的映射关系,并没有规定这个二进制数字怎样存储到内存中。
于是出现了各种 Unicode 编码的存储方式:
Unicode标准提供三种不同的编码格式:UTF-8,UTF-16,UTF-32
UTF-32:每隔编码单元长为 4 字节, 与 Unicode 编码一一对应。
UTF-16:在UTF-16中,在范围U+0000到U+FFFF间的码点使用一个单一的16位编码单元表示;而在范围U+10000到U+10FFFF间的码点则使用一对16位编码单元表示,称作代理对(surrogate pair)。 所以 UTF-16 是变长的编码,有时候会出现 4 字节表示一个编码的格式。
UTF-8:变长存储方式,ASCII 码只有一个字节存储,中文字符要三个字节存储。

UCS2:是 UTF-16 的子集,固定编码长度,每个字符用 2 个字节表示。
GBK:国标码,ASCII 用 1 个字节表示,中文字符用 2 个字节表示。

3. 编程:
为什么要有 char、wchar_t 的区别?
ASCII 或者 Unicode 字符串,存储到内存中后都是二进制数据,在计算机看来没有什么区别,char 也可以存储 Unicode 字符串, wchar_t 也可以存储 ASCII 字符串,只不过在处理的时候要小心各种问题罢了。
用 char 来存储 ASCII 或者 UTF-8 字符串,strlen、strcmp 等字符串处理函数可以方便地去处理。
用 wchar_t 来存储 Unicode 字符串,有 wstrlen 等方法可以方便地去处理。
之所以又多出来一个 wchar_t ,只是为了方便编程罢了。

http://blog.jobbole.com/76376/

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

http://www.cppblog.com/tx7do/archive/2008/06/26/54617.html

原文地址:https://www.cnblogs.com/zuibunan/p/3878667.html