UTF-8、ISO 8859-1、GB、CP936……


好了,这个标题是夸张了一点,不过最近我的确为字符编码的问题头疼了不少,也就有了下面的学习笔记……

网上关于字符编码的文章也够多了,所以我想写的实用一些,简单一些。

先看看常用的字符编码:

ASCII:


美国信息交换标准码。 在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),但其最高位(b7)用作奇偶校验位。

ISO8859-1、EASCII:


EASCII是ASCII的扩充,把第八位也用来存储信息;在Windows中用Alt+小键盘数字输入的就是EASCII码对应字符。ISO8859-1就是EASCII最典型的实现,基本能够覆盖西欧的拉丁字母,所以又叫Latin-1。有些国外程序就要求使用ISO8859-1编码以保证Binary Safe,比如著名的XMB

Unicode、UTF-8:


Unicode是业界的一种标准,它可以使电脑得以呈现世界上数十种文字的系统。

Unicode的实现方式不同于编码方式,一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。于是就有了UTF-8、UTF-16、UTF-32。

UTF-8使用一至四个字节为每个字符编码:
ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母(即以ISO 8859为主的)则需要二个字节编码(Unicode范围由U+0080至U+07FF)。其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,包括汉字)使用三个字节编码。其他极少使用的Unicode 辅助平面的字符使用四字节编码。它唯一的好处在于兼容ASCII。
UTF-16则是以U+10000为分界线,使用两个字节或者四个字节存储。
UTF-32则是全部使用4字节编码,很浪费空间。

GB2312、GBK、GB18030:


GB是中国荒谬的国家标准。GB2312、GBK、GB18030各为前一个的扩展。

我从来讨厌GB编码,因为它毫无国际兼容性。更荒谬的是,GBK和GB18030几乎是照着Unicode字符集选取的字库。这样多此一举地弄出一套编码,还强制所有在中国销售的操作系统必须使用它,真是天朝特色。

另外,对于GB编码PHP是不认账的,mb_detect_encoding函数会把GB编码识别成CP936。

他们和我们有什么关系?该用什么?


对于弄Web的人来说字符编码绝对不陌生:设置Form标签的Accept-Charset、UTF的BOM签名导致PHP报"Header Already Sent"都是经常会见到的。到底应该用什么?

毫无疑问,凡是有脑子的人都应该摒弃GB编码使用UTF-8。UTF-8具有非常良好的兼容性,在不同语言的操作系统中都可以浏览;而且PHP的不少字符串函数对UTF-8编码的字符串的兼容性都好于对GB编码的字符串的。

然而,目前的情况是,国内的网站很多都在使用GB编码,像Discuz!、PHPWind这样的国产PHP软件则同时提供GBK和UTF-8编码,但总体上以GBK编码为主。像WordPress一类的国际化软件则一律使用UTF-8。
Google的首页(无论.cn还是.com)使用UTF-8,甚至将HTTP标头的Accept-Charset设置为ASCII、ISO-8859-1时Google.com都返回UTF-8编码的首页;而百度则是无论怎么都使用愚蠢的GB2312编码。

另外也需要注意一点:浏览器永远依照HTTP Header里的Content-Type中的字符编码说明来处理HTML,而不是依据meta标签的声明。有时什么都不标注甚至使用混合编码的HTML就会被显示为乱码,而在Chrome中无法方便的调整字符编码,这点实在是很糟糕。

OK,现在就把Dreamweaver首选项里的默认编码调成UTF-8吧。

评论

Velanlee 2010-03-09 14:12:14
还真没留意过,学习了!更爱Google和WordPress了。:D