下一页 上一页 目录

1. 简介

1.1 为什么使用 Unicode?

不同国家的人们使用不同的字符来表示他们的母语词汇。如今,大多数应用程序,包括电子邮件系统和网络浏览器,都是 8 位干净的,也就是说,只要文本以 8 位字符集(如 ISO-8859-1)表示,它们就可以正确地操作和显示文本。

世界上有远不止 256 个字符 - 想想西里尔文、希伯来文、阿拉伯文、中文、日文、韩文和泰文 - 而且新的字符还在不断被创造出来。用户遇到的问题是

解决这个问题的方法是采用全球通用的字符集。这个字符集就是 Unicode http://www.unicode.org/。有关 Unicode 的更多信息,请执行 `man 7 unicode' 命令(手册页包含在 man-pages-1.20 软件包中)。

1.2 Unicode 编码

这把用户处理字符集的问题简化为一个技术问题:如何使用 8 位字节传输 Unicode 字符?8 位单元是大多数计算机的最小寻址单元,也是 TCP/IP 网络连接使用的单元。然而,使用 1 个字节来表示 1 个字符是历史的偶然,这是因为计算机发展始于欧洲和美国,在那里 96 个字符在很长一段时间内被认为足够使用。

基本上有四种方法可以将 Unicode 字符编码为字节

UTF-8

128 个字符使用 1 个字节编码(ASCII 字符)。1920 个字符使用 2 个字节编码(罗马字符、希腊字符、西里尔字符、科普特字符、亚美尼亚字符、希伯来字符、阿拉伯字符)。63488 个字符使用 3 个字节编码(包括中文和日文)。其他 2147418112 个字符(尚未分配)可以使用 4、5 或 6 个字符编码。有关 UTF-8 的更多信息,请执行 `man 7 utf-8' 命令(手册页包含在 man-pages-1.20 软件包中)。

UCS-2

每个字符都表示为两个字节。这种编码只能表示前 65536 个 Unicode 字符。

UTF-16

这是 UCS-2 的扩展,可以表示 1112064 个 Unicode 字符。前 65536 个 Unicode 字符表示为两个字节,其余的表示为四个字节。

UCS-4

每个字符都表示为四个字节。

与当前使用的编码(欧洲语言每个字符 8 位,中文/日文/韩文更多)相比,文本编码的空间要求如下。这会影响磁盘存储空间和网络下载速度(当不使用任何形式的压缩时)。

UTF-8

对于 US ASCII 没有变化,对于 ISO-8859-1 只是多了几个百分点,对于中文/日文/韩文多 50%,对于希腊文和西里尔文多 100%。

UCS-2 和 UTF-16

对于中文/日文/韩文没有变化。对于 US ASCII 和 ISO-8859-1、希腊文和西里尔文多 100%。

UCS-4

对于中文/日文/韩文多 100%。对于 US ASCII 和 ISO-8859-1、希腊文和西里尔文多 300%。

考虑到 UCS-2、UTF-16 和 UCS-4 对美国和欧洲文档造成的额外开销,这些编码似乎不太可能得到广泛使用。Microsoft Win32 API 自 1995 年(至少)以来就支持 UCS-2 编码,但这种编码尚未在文档中得到广泛采用 - SJIS 仍然在日本流行。

另一方面,UTF-8 有可能得到广泛使用,因为它不会给美国和欧洲用户带来额外开销,而且许多文本处理程序不需要为了支持 UTF-8 而进行更改。

在下文中,我们将描述如何更改您的 Linux 系统,使其使用 UTF-8 作为文本编码。

C/C++ 开发人员的脚注

Microsoft Win32 的方法使开发人员可以轻松地生成程序的 Unicode 版本:您在程序的顶部 "#define UNICODE",然后将许多出现的 `char' 更改为 `TCHAR',直到您的程序在没有警告的情况下编译。 它的问题是,您最终会得到程序的两个版本:一个版本理解 UCS-2 文本但不理解 8 位编码,另一个版本只理解旧的 8 位编码。

此外,UCS-2 和 UCS-4 存在字节序问题。IANA 字符集注册表 http://www.isi.edu/in-notes/iana/assignments/character-sets 关于 ISO-10646-UCS-2 说:“这需要指定网络字节顺序:标准未指定”。网络字节顺序是大端字节序。而 RFC 2152 更明确地指出:“ISO/IEC 10646-1:1993(E) 规定,当 UCS-2 形式的字符序列化为八位字节时,最高有效位字节应首先出现。” 然而,Microsoft 在其 C/C++ 开发工具中,建议使用机器相关的字节序(即 ix86 处理器上的小端字节序),并在文档开头使用字节顺序标记,或使用一些统计启发式方法(!)。

另一方面,UTF-8 方法将 `char*' 保留为标准 C 字符串类型。因此,您的程序将处理 US ASCII 文本,而与任何环境变量无关,并且只要 LANG 环境变量设置正确,就可以处理 ISO-8859-1 和 UTF-8 编码的文本。

1.3 相关资源

Markus Kuhn 最新的资源列表

Roman Czyborra 对 Unicode、UTF-8 和支持 UTF-8 的程序的概述:http://czyborra.com/utf/#UTF-8

一些 UTF-8 示例文件


下一页 上一页 目录