中文编码格式简介

上传人:平*** 文档编号:8670345 上传时间:2017-09-28 格式:DOC 页数:9 大小:48.52KB
返回 下载 相关 举报
中文编码格式简介_第1页
第1页 / 共9页
中文编码格式简介_第2页
第2页 / 共9页
中文编码格式简介_第3页
第3页 / 共9页
中文编码格式简介_第4页
第4页 / 共9页
中文编码格式简介_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《中文编码格式简介》由会员分享,可在线阅读,更多相关《中文编码格式简介(9页珍藏版)》请在金锄头文库上搜索。

1、以下是本人从网上找的,旨在让程序员能真正掌握编码以及解决相关的问题谈谈 Unicode 编码,简要解释 UCS、UTF、BMP、BOM 等名词这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打 RPG 游戏的升级。整理这篇文章的动机是两个问题: 问题一: 使用 Windows 记事本的“另存为”,可以在 GBK、Unicode、Unicode big endian和 UTF-8 这几种编码方式间相互转换。同样是 txt 文件,Windows 是怎样识别编码方式的呢? 我很早前就发现 Unicode、Unicode big endian 和

2、 UTF-8 编码的 txt 文件的开头会多出几个字节,分别是 FF、FE(Unicode),FE、FF (Unicode big endian),EF、BB、BF(UTF-8)。但这些标记是基于什么标准呢? 问题二: 最近在网上看到一个 ConvertUTF.c,实现了 UTF-32、UTF-16 和 UTF-8 这三种编码方式的相互转换。对于 Unicode(UCS2)、GBK、UTF-8 这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来 UTF-16 和 UCS2 有什么关系。 查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些 Unicode 的细节。写成一篇文章,送

3、给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。 0、 big endian 和 little endianbig endian 和 little endian 是 CPU 处理多字节数的不同方式。例如“汉”字的 Unicode 编码是 6C49。那么写到文件里时,究竟是将 6C 写在前面,还是将 49 写在前面?如果将 6C 写在前面,就是 big endian。如果将 49 写在前面,就是 little endian。 “endian”这个词出自 格列佛游记 。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Lit

4、tle-Endian) 敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。 我们一般将 endian 翻译成“ 字节序 ”,将 big endian 和 little endian 称作“大尾”和“小尾”。 1、字符编码、内码,顺带介绍汉字编码字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用 7 位的 ASCII 编码,为了处理汉字,程序员设计了用于简体中文的 GB2312 和用于繁体中文的 big5。 GB2312(1980 年)一共收录了 7445 个字符,包括 6763 个汉字和 682 个其它符号。汉字区的内码范围高字节从 B0-F7

5、,低字节从 A1-FE,占用的码位是 72*94=6768。其中有 5 个空位是 D7FA-D7FE。 GB2312 支持的汉字太少。1995 年的汉字扩展规范 GBK1.0 收录了 21886 个符号,它分为汉字区和图形符号区。汉字区包括 21003 个字符。 从 ASCII、GB2312 到 GBK,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为 0。按照程序员的称呼,GB2312、GBK 都属于双字节字符集 (DBCS)。 2000 年的 GB18030 是取代

6、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 字节方案。其中单字节、双字

7、节和 GBK 是完全兼容的。4 字节编码的码位就是收录了 CJK 扩展 A 的 6582 个汉字。例如:UCS 的 0x3400在 GB18030 中的编码应该是 8139EF30,UCS 的 0x3401 在 GB18030 中的编码应该是8139EF31。 微软提供了 GB18030 的升级包,但这个升级包只是提供了一套支持 CJK 扩展 A 的 6582 个汉字的新字体:新宋体-18030,并不改变内码。Windows 的内码仍然是 GBK。 这里还有一些细节: GB2312 的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上 A0。 对于任何字符编码,编码单元的顺序是由编

8、码方案指定的,与 endian 无关。例如 GBK 的编码单元是字节,用两个字节表示一个汉字。这两个字节的顺序是固定的,不受 CPU 字节序的影响。UTF-16 的编码单元是 word(双字节),word 之间的顺序是编码方案指定的,word 内部的字节排列才会受到 endian 的影响。后面还会介绍 UTF-16。 GB2312 的两个字节的最高位都是 1。但符合这个条件的码位只有 128*128=16384 个。所以GBK 和 GB18030 的低字节最高位都可能不是 1。不过这不影响 DBCS 字符流的解析:在读取 DBCS字符流时,只要遇到高位为 1 的字节,就可以将下两个字节作为一个

9、双字节编码,而不用管低字节的高位是什么。2、 Unicode、UCS 和 UTF前面提到从 ASCII、GB2312、GBK 到 GB18030 的编码方法是向下兼容的。而 Unicode 只与 ASCII 兼容(更准确地说,是与 ISO-8859-1 兼容),与 GB 码不兼容。例如“汉”字的Unicode 编码是 6C49,而 GB 码是 BABA。 Unicode 也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode 的学名是 Universal Multiple-Octet Coded Character Set,简称为UCS。UCS 可以

10、看作是Unicode Character Set的缩写。 根据维基百科全书(http:/zh.wikipedia.org/wiki/)的记载:历史上存在两个试图独立设计Unicode 的组织,即国际标准化组织(ISO)和一个软件制造商的协会(unicode.org )。ISO 开发了 ISO 10646 项目, Unicode 协会开发了 Unicode 项目。 在 1991 年前后,双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。从 Unicode2.0 开始,Unicode 项目采用了与ISO 10646-1 相同的字库和字码。

11、目前两个项目仍都存在,并独立地公布各自的标准。Unicode 协会现在的最新版本是 2005 年的 Unicode 4.1.0。ISO 的最新标准是 ISO 10646-3:2003。 UCS 只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的 UCS 编码是6C49,我可以用 4 个 ascii 数字来传输、保存这个编码;也可以用 utf-8 编码:3 个连续的字节 E6 B1 89 来表示它。关键在于通信双方都要认可。 UTF-8、UTF-7 、UTF-16 都是被广泛接受的方案。UTF-8 的一个特别的好处是它与 ISO- 8859-1 完全兼容。UTF 是“UCS Tr

12、ansformation Format”的缩写。 IETF 的 RFC2781 和 RFC3629 以 RFC 的一贯风格,清晰、明快又不失严谨地描述了 UTF-16 和 UTF-8 的编码方法。我总是记不得 IETF 是 Internet Engineering Task Force 的缩写。但 IETF 负责维护的 RFC 是 Internet 上一切规范的基础。 2.1、内码和 code page目前 Windows 的内核已经支持 Unicode 字符集,这样在内核上可以支持全世界所有的语言文字。但是由于现有的大量程序和文档都采用了某种特定语言的编码,例如 GBK,Windows 不可

13、能不支持现有的编码,而全部改用 Unicode。 Windows 使用代码页(code page)来适应各个国家和地区。code page 可以被理解为前面提到的内码。GBK 对应的 code page 是 CP936。 微软也为 GB18030 定义了 code page:CP54936。但是由于 GB18030 有一部分 4 字节编码,而 Windows 的代码页只支持单字节和双字节编码,所以这个 code page 是无法真正使用的。 3、 UCS-2、UCS-4、BMPUCS 有两种格式:UCS-2 和 UCS-4。顾名思义,UCS-2 就是用两个字节编码,UCS-4 就是用 4 个字

14、节(实际上只用了 31 位,最高位必须为 0)编码。下面让我们做一些简单的数学游戏: UCS-2 有 216=65536 个码位,UCS-4 有 231=2147483648 个码位。 UCS-4 根据最高位为 0 的最高字节分成 27=128 个 group。每个 group 再根据次高字节分为 256 个 plane。每个 plane 根据第 3 个字节分为 256 行 (rows),每行包含 256 个cells。当然同一行的 cells 只是最后一个字节不同,其余都相同。 group 0 的 plane 0 被称作 Basic Multilingual Plane, 即 BMP。或者说

15、 UCS-4 中,高两个字节为 0 的码位被称作 BMP。 将 UCS-4 的 BMP 去掉前面的两个零字节就得到了 UCS-2。在 UCS-2 的两个字节前加上两个零字节,就得到了 UCS-4 的 BMP。而目前的 UCS-4 规范中还没有任何字符被分配在 BMP 之外。 4、 UTF 编码UTF-8 就是以 8 位为单元对 UCS 进行编码。从 UCS-2 到 UTF-8 的编码方式如下: UCS-2 编码(16 进制)UTF-8 字节流(二进制) 0000 - 007F0xxxxxxx 0080 - 07FF110xxxxx 10xxxxxx 0800 - FFFF1110xxxx 10

16、xxxxxx 10xxxxxx 例如“汉”字的 Unicode 编码是 6C49。6C49 在 0800-FFFF 之间,所以肯定要用 3 字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将 6C49 写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的 x,得到:11100110 10110001 10001001,即 E6 B1 89。 读者可以用记事本测试一下我们的编码是否正确。需要注意,UltraEdit 在打开 utf-8 编码的文本文件时会自动转换为 UTF-16,可能产生混淆。你可以在设置中关掉这个选项。更好的工具是 Hex Workshop。 UTF-16 以 16 位为单元对 UCS 进行编码。对于小于 0x10000 的 UCS 码,UTF-16 编码就等于 UCS 码对应的 16 位无符号整数。对于不小于 0x10000 的 UCS 码,定义了一个算法。不过由于实际使用的 UCS2,或者 UCS4 的 BMP 必然小于 0x100

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号