万字长文讲解编码知识,看这文就够了!| 原力计划( 六 )


文章插图
总结
1、简单地说:Unicode和UCS是字符集,不属于编码UTF-8、UTF-16、UTF-32等是针对Unicode字符集的编码,UCS-2和UCS-4是针对UCS字符集的编码(只是我们习惯把Unicode字符集编码简称为Unicode编码,把UCS字符集编码称为UCS编码) 。
Unicode沿用UCS字符集,在UCS-2和UCS-4基础上提出的UTF-16、UTF-32 。并发展了UTF-8,发展到现在,就密不可分了,大家基于UCS就把Uniocde维护好就行,发布标准大家统一 。以往的UCS-2和UCS-4概念就默认作废了这样一个关系,整个他们的发展长话短说就是这样,懂了吗 。
2、UTF-8、UTF-16、UTF-32、UCS-2、UCS-4对比:

万字长文讲解编码知识,看这文就够了!| 原力计划

文章插图
由于历史方面的原因,你还会在不少地方看到把Unicode称为一种编码的情况,那是因为早期的2字节编码最初称为“ Unicode”,但现在称为“ UCS-2”,这种情况下的 Unicode 通常就是 UTF-16 或者是更早的 UCS-2 编码,只是被一直搞混了,在某些老软件上尤为常见 。比如下面editplus里面文件编码设置 。
万字长文讲解编码知识,看这文就够了!| 原力计划

文章插图
以前的Windows电脑上的记事本(左边)显示的是Unicode,不过现在好像改了变成了UTF-16 。
万字长文讲解编码知识,看这文就够了!| 原力计划

文章插图
不过由于各种原因,必须承认,在不同的语境下,“Unicode”这个词有着不同的含义 。
它可能指:
(1)Unicode 标准
(2)Unicode 字符集
(3)Unicode 的抽象编码(编号),也即码点、码位(code point)
(4)Unicode 的一个具体编码实现,通常即为变长的 UTF-16(16 或 32 位),又或者是更早期的定长 16 位的 UCS-2
【万字长文讲解编码知识,看这文就够了!| 原力计划】所以像我一般有时候非要区分的话都是直接说全,Unicode 标准,Unicode 字符集,Unicode编码等等 。
万字长文讲解编码知识,看这文就够了!| 原力计划

文章插图
ANSI编码
为使计算机支持更多语言,通常使用0x800~xFF范围的2个字节来表示1个字符 。比如:汉字‘中’ 在中文操作系统中,使用 [0xD6,0xD0]这两个字节存储 。
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准 。这些使用多个字节来代表一个字符的各种语言延伸编码方式,称为 ANSI 编码 。
在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码 。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中 。
在使用ANSI编码支持多语言阶段,每个字符使用一个字节或多个字节来表示(MBCS,Multi-Byte Character System),因此,这种方式存放的字符也被称作多字节字符 。比如,“中文123” 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节 。
在非 Unicode 环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况 。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非Unicode 的字符编码转换为同一字符对应的系统内部使用的Unicode 编码 。
可以在“语言与区域设置”中选择一个代码页作为非 Unicode 编码所采用的默认编码方式,如936为简体中文GBK,950为正体中文Big5(皆指PC上使用的) 。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码 。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免 。
从根本上说,完全采用统一编码才是解决之道,虽然现在Unicode有了,但由于历史遗留,老软件等等原因,所以系统统一用某种编码格式的Unicode目前尚无法做到这一点 。
代码页技术现在广泛为各种平台所采用 。UTF-7 的代码页是65000,UTF-8的代码页是65001 。简体中文上使用的代码页为936,GBK编码 。
以前中文DOS、中文/日文Windows95/98时代系统内码使用的是ANSI编码(本地化,根据不同地区设置不同的系统内码Windows版本),现在win7,win10等等系统的内码都是用的Unicode 。
不过微软为了以前的程序兼容性,比如在某些情况下,比如你的程序需要和不支持Unicode的程序交互时,可能还是会需要用到code page,提供代码页服务(就好比微软不能说:“老子支持unicode了,以后不支持Unicode的程序都给我滚粗 。”只能撅着屁股让这些老掉牙的程序仍然可以运行,于是只好给他们提供一个“非Unicode默认字符集”)。可以在cmd下输入chcp查看code page 。


推荐阅读