分享

为什么用Utf-8编码

 just_person 2009-10-21
Utf-8编码在国外应用普遍,为什么在国内应用却不多呢? 尤其各大门户网站采用Utf-8的几乎没有。 是否采用Utf-8,这个问题大家争论已久,但是很少有人系统地解说为什么要采用Utf-8编码? 凡事皆有正反!采用Utf-8编码同样有其利弊,当利大于弊,我们当然就采用Utf-8? 关于UTF-8编码和中文字符集 中文有三种字符集,统一文字的编码将是进一步交流的基础。 ·国内网站和BLOG较多使用简体中文编码GB2312 字符集; ·港澳台地区网站和部落格使用繁体中文网页编码BIG5字符集; ·UTF-8 包含了简体和繁体中文字符,能正确显示多种语言文字.
    统一编码带来的交流便利将在trackback等功能上体现出。 计算机对多国语言的支持 通常在文档只需支持一种语言的情况下,编码只需收录该语言内的字元。最常见的就是拉丁字母用ASCII、简体中文用GB2312、繁体中文用BIG5等。 在越来越国际化的环境下,多语言支持对于软件开发已不再是个可有可无的而是必须的功能。UTF-8就提供了可在同文档同时支持多语言。例如, 汉字:简体字,繁體字 韩文:??? 阿拉伯文:??????? 目前很多软件对UTF-8的支持都不太好、开发工具对UTF-8的支持也不全、程序员对UTF-8的了解不深,所以用UTF-8时会碰见许多问题。但我们坚信UTF8是对于多语言支持的趋势也是基础。 Unicode 问答集 问:什么是Unicode? 答:Unicode 给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论什么语言。Unicode标准已经被这些工业界的领导们所采用,例 如:Apple, HP, IBM, JustSystem, Microsoft, oracle, SAP, Sun, Sybase, Unisys和其它许多公司。最新的标准都需要Unicode,例如XML, Java, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML等等,并且,Unicode是实现ISO/IEC 10646的正规方式。许多操作系统,所有最新的浏览器和许多其他产品都支持它。Unicode标准的出现和支持它工具的存在,是近来全球软件技术最重要 的发展趋势。 问:为什么使用Unicode? 答:基本上,计算机只是处理数字。它们指定一个数字,来储存字母或其他字符。在 创造Unicode之前,有数百种指定这些数字的编码系统。没有一个编码可以包含足够的字符:例如,单单欧州共同体就需要好几种不同的编码来包括所有的语 言。即使是单一种语言,例如英语,也没有哪一个编码可以适用于所有的字母,标点符号,和常用的技术符号。这些编码系统也会互相冲突。也就是说,两种编码可 能使用相同的数字代表两个不同的字符,或使用不同的数字代表相同的字符。任何一台特定的计算机(特别是服务器)都需要支持许多不同的编码,但是,不论什么 时候数据通过不同的编码或平台之间,那些数据总会有损坏的危险。 问:举个例子吧。 答:比如,简体中文(GB)、繁体中文 (BIG5)、日文中,“赵”都是一个字,但是编码不同。在不同的编码下,BIG5的赵是0xBBAF,而0xBBAF在GB里面就被显示为“化”,这就 是乱码。而Unicode采用统一的编码,“赵”只有一个,不必管他在哪种文字里。 问:Unicode的优点是什么? 答:举 一个最明显的例子就是Windows 2000/XP以及微软Office2000及其后的产品。因为这些软件都是Unicode内核,因此,无论何种文字,都可以在上面正常显示,而且是同屏 显示。以前,简体中文的Word文件拿到英文版打开就会是乱码,简体中文的程序在Windows英文版上运行会出现乱码,而现在一切都解决了。 问:中国京剧戏考为什么使用Unicode? 答: 因为有些剧本中的生僻字,只在扩展字库或繁体字库中才有,有的甚至没有。而Unicode不仅包含了所有常用字和大部分生僻字,而且因为其可扩展,在现在 没有的情况下,将来也是可以扩充的。例如最新的Unicode 4.0标准,较3.0增加了很多生僻字。目前有70207个汉字。再有一点就是Unicode在将来会取代现有的GBK及BIG5。 什么是 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-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编码。 多语言编码 多语言编码的优点是可以在一个页面里同时显示多种语言。像这样,“アメリカ”、“????”、“???????????”。但是本地编码的方式通常只能显示一种语言的文字,其他语言的文字就乱码了。 为什么在一个页面里会要多种文字呢?举个例子,blog经常引用别人的网站吧,那么我现在引用了这个“http://www.????????.com”,还有这个名称比较有趣的“http://www.♣.com”。 这就需要多语言的编码了。(这些网站在支持punycode的浏览器里,如mozilla, firefox,是可以直接访问的) 再 举个例子,我有一个webmail,界面是中文的,编码是GBK。朋友给我发邮件,中文的、英文的都没有问题,正常显示。可我还有朋友是以色列的,用的是 希伯来语给我发的邮件。完蛋,邮件内容都是乱码了。我得手工选择浏览器的编码才能看明白邮件的内容。遗憾的是,这时界面的“回复”按钮又成了乱码,搞得我 看不出哪个按钮是回复了。如果webmail是多语言的编码,比如UTF-8,就不会有这样了。 UTF-8对中文为主的网站有个缺点是,页面变长了。不是内容显示变长了,而是文件的size变长了。UTF-8对一个中文字符的编码通常是3个 byte,而GB2312是2个byte。 使用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-8相关讨论:xdanger说:”地区编码gb2312的好处就是对于搜索引擎比较友好,特别 是baidu的网页快照都是gb2312的,Google搜utf-8的效果也不如gb2312。” 我们盲目的向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正处在发展当中。 utf-8是一种歧视性的编码,采用gb2312一个汉字只需要两个字节,而utf-8要三个字节,平白无故的就要多出一个字节来,你想想这样中文文档的 存储,网络传输平白又要多出多少浪费来。老外自己都承认了: Let’s address the problem first: UTF-8 is kind of racist. It allows us round-eye paleface anglophone types to tuck our characters neatly into one byte, lets most people whose languages are headquartered west of the Indus river get away with two bytes per, and penalizes India and points east by requiring them to use three bytes per character. 就算要统一编码,作为中国人那也只能支持utf-16,而不是utf-8

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多