utf-8为什么在国外流行了
2006-02-12  作者:amao  同分类文章
description:

我们盲目的向utf-8靠齐是不明智的,因为使用utf-8 用英文的老外没有增加成本,但是我们为了所谓的兼容却要增加成本。

因为如果是全英文的话,数据库根本不会增加,什么意思呢,就是说如果英文站点换成utf8,只是编码方式变了一下,其他的基本上一点影响都没有,但是带来的好处是鲜见的。其他文字已经在utf-8编码里面了,所以可以任意使用。(例如在英文站点上如果用utf-8,汉字就可以使用了,但是使用3个字节编码,但是汉字毕竟是少数!所以他们不是很在乎。)


但是如果在国内,情况就不同了,大部分都是汉字,用GB2312(国家标准GB18030-2000)编码,两个字节编码,如果换成utf-8后,就变成了3个字节,数据明显增大,有人会说utf-8解决了兼容问题,你试想一下,来中文站点的有几个是使用英文以外语言的!!如果他用英文,恭喜你,只要你装上了GB编码,你就可以自由的使用了,因为GB中是有英文字体的!如果你担心他看不懂中文,那你用utf-8编码的中文他也是看不懂的!

数字图书馆,也就是图书数字化,推荐使用iso 10646 (4byte编码)

特别需要注意的是,ISO 10646 / Unicode也有多种变换形式,UTF-8和UTF-16。新近又增加了UTF-32。从数字化的发展来看,最好直接使用UCS-2而不要涉及这些变换形式,以免造成今后转换的负担。UTF-8看来已经落后;而UTF-16(Surrogate)还不够成熟。UTF-32正处在发展当中。

什么是 UCS 和 ISO 10646?

国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS). UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息.

在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 '' 或 '/', 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为 Unicode 的外部编码.

UCS只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的UCS编码是6C49,我可以用4个ascii数字来传输、保存这个编码;也可以用utf-8编码:3个连续的字节E6 B1 89来表示它。

UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:

UCS-2编码(16进制) UTF-8 字节流(二进制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110  1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

使用UTF-8的原因

由于要使文字档案之中的文字与ASCII兼容,故此 UTF-8 选择了使用可变长度字节来储存 Unicode ,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

对 UTF-8 的批评

UTF-8 使用可变长度字节储存,使电脑程序设计变得复杂。 (故此,在电脑程序或操作系统内部,多采用UCS-2编码。)

在旧式的中文、日文及韩文编码之中,每字符都使用2字节储存,而UTF-8须使用3字节。 (采用UTF-16编码则可只使用2字节储存。)

泰语以往使用的ISO 8859-11,每字符只使用1字节储存,而UTF-8须使用3字节。

此外,在Windows XP版本中的记事本程序如果保存的是编码类似于UTF-8的GB2312字符,保存重新打开后将错误显示。例如:使用记事本输入“联通”两个字或“毛”字保存后再打开显示错误,如果不全是编码类似于UTF-8的GB2312字符则不会出现这种情况。

UTF-16

UTF-16是Unicode的其中一个使用方式。 UTF是 Unicode Translation Format,即把Unicode转做某种格式的意思。
它定义于ISO/IEC 10646-1的附录Q,而RFC2781也定义了相似的做法。
在Unicode基本多文种平面定义的字符(无论是拉丁字母、汉字或其他文字或符号),一律使用2字节储存。而在辅助平面定义的字符,会以代理对(surrogate pair)的形式,以两个2字节的值来储存。

UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词



相关
老PHP程序的Register Globals 问题
linux远程管理工具Webmin安装指南
php的报表(图表)工具
IBM:使用PHP将XML转换为JSON
PHP中文件格式类
置顶功能
开始关注php的oop!拿出王古战牛皮的精神
Zend Framework is out
让phpmailer支持中文名称的附件
用php模拟post来提交数据