式的相互转换。对于 Unicode(UCS2)、GBK、UTF-8 这些编码方式,我原来就了解。但这
个程序让我有些糊涂,想不起来 UTF-16 和 UCS2 有什么关系。
查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些 Unicode 的细节。写
成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知
道什么是字节,什么是十六进制。
0、big endian 和 little endian
big endian 和 littleendian 是 CPU 处理多字节数的不同方式。例如“汉”字的 Unicode 编码
是 6C49。那么写到文件里时,究竟是将 6C 写在前面,还是将 49 写在前面?如果将 6C 写
在前面,就是 big endian。如果将 49 写在前面,就是 little endian。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头
(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,
另一个丢了王位。
我们一般将 endian 翻译成“字节序”,将 big endian 和 little endian 称作“大尾”和“小尾”。
1、字符编码、内码,顺带介绍汉字编码
字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。
早期的计算机使用 7 位的 ASCII 编码,为了处理汉字,程序员设计了用于简体中文的
GB2312 和用于繁体中文的 big5。
GB2312(1980 年)一共收录了 7445 个字符,包括 6763 个汉字和 682 个其它符号。汉字
区的内码范围高字节从 B0-F7,低字节从 A1-FE,占用的码位是 72*94=6768。其中有 5 个
空位是 D7FA-D7FE。
GB2312 支持的汉字太少。1995 年的汉字扩展规范 GBK1.0 收录了 21886 个符号,它分
为汉字区和图形符号区。汉字区包括 21003 个字符。
从 ASCII、GB2312 到 GBK,这些编码方法是向下兼容的,即同一个字符在这些方案
中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一
地 处 理 。 区 分 中 文 编 码 的 方 法 是 高 字 节 的 最 高 位 不 为 0 。 按 照 程 序 员 的 称 呼 ,
GB2312、GBK 都属于双字节字符集 (DBCS)。
2000 年的 GB18030 是取代 GBK1.0 的正式国家标准。该标准收录了 27484 个汉字,同
时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说, GB18030 在
GB13000.1 的 20902 个 汉 字 的 基 础 上 增 加 了 CJK 扩 展 A 的 6582 个 汉 字 ( Unicode 码
0x3400-0x4db5),一共收录了 27484 个汉字。
CJK 就是中日韩的意思。Unicode 为了节省码位,将中日韩三国语言中的文字统一编
码。GB13000.1 就是 ISO/IEC 10646-1 的中文版,相当于 Unicode 1.1。
GB18030 的编码采用单字节、双字节和 4 字节方案。其中单字节、双字节和 GBK 是完
全兼容的。4 字节编码的码位就是收录了 CJK 扩展 A 的 6582 个汉字。例如: UCS 的
评论0
最新资源