乱码大全(17)──Unicode(4; HTML与Unicode)

来源:百度文库 编辑:神马文学网 时间:2024/04/27 23:47:02
乱码大全(17)──Unicode(4; HTML与Unicode)  “乱码大全”,作者:bluesea,水木清华 BBS 成员。欢迎在 BBS 中转载,帮助计算机初学者解决使用软件过程中遇到的实际问题。本文原载于水木清华 BBS 的 Internet讨论区。地址是: telnet://bbs.tsinghua.edu.cn ,WWW访问的地址是 http://bbs.tsinghua.edu.cn 。当下面的条件全部满足时,转载本文可以不经过作者允许:(1) 转载水木清华 BBS 的信头;(2)不修改原文;(3) 转载仅限于各种 BBS 和非商业性质的个人网点。严禁各种形式的抄袭,严禁非作者将 本文或局部用于任何正式出版的刊物。请所有转载文章的网友注意阅读本文的第一段,遵守网络的惯例、尊重作者的劳动。本自然段是全文的一部分。
bluesea@163.net
在 HTML 中,语言的国际交换也面临很多新的问题。可参见RFC2070,标题: Internationalization of the Hypertext Markup Language。本文涉及的问题只能说和 Unicode 沾边,主要为澄清一些通常我们容易混淆的概念。
为了信息的交换,首先必须统一信息的表示。因为高于 127 的那些字符在 ANSI 或 ISO Latin-1 (8859-1) 中可能表示一些欧洲字母,而在一些双字节编码中又可能和相邻的字符一起用于表示汉字或其他符号,这也就引起了歧义。首先被确定下来的就是扩展字符在 HTML 文本中的表示方法。
第一种方法是使用:“Ampersand, Crosshatch, ISO decimal code, Semicolon (与号、井号、数字和分号)”序列,例如带重音符号的字母 a,其编码是十进制 224,这样在 HTML 中表示为à;
第二种方法是使用:“Ampersand, Mixed-case name, Semicolon(与号、命名和分号)”序列,例如带重音符号的字母 a ("a" with grave accent), 可以在 HTML 中表示为 à 有关这些字符的命名列表,参见 RFC2070。
我们搞清楚了欧洲字符在 HTML 中的表示,就很自然地回到 HTML 中的著名的汉字乱码问题:当 charset=iso-8859-1 时,汉字在 Netscape 和中文 IE 中的显示不同,中文 IE 显示为乱码。很多人指出 Netscape 使用的是 Unicode,那么到底是不是呢,我们来看这个例子:
我们首先看汉字“啊”,区位码1601;GB编码 0xa1b0;即:161,176。在字符集中,°是单位“度”(小圆圈)的符号,¡是倒写的叹号。我们编写下面的 HTML 文本。


°¡°¡ 啊


在中文 IE4.0 中,我们看到的是两个小圆圈、两个倒写的叹号和一个“啊”字, 而在PWidnows 95 环境中 Netscape 显示的是三个“啊”字。 我们用 Netscape Composer 编写网页,选择 iso-8859-1,“啊”字将被编码为 °¡ 可见这样出现的汉字,并不是 Unicode,而仅仅是把一个汉字简单地分成了两个欧洲字符来表示。在这个情况下,Netscape 分不清汉字和欧洲符号。
Netscape Composer 支持用 Unicode 转换码来制作网页。我们选择字符为 UTF-8 并在 Composer 中输入一个“啊”字。结果在 HTML 中出现的是“掳隆”,一个汉字在 UTF-8 中不可能占据 4 个字节。我们对生成的 HTML 文件用 Netscape Navigator 显示,结果全是“啊”,而用 IE 4.0 显示的是一个小圆圈和一个倒写的叹号。可见 Netscape 的显示结果有问题。这里特意手工编写了一个的 UTF-8 转换码的 HTML:





UTF-8姹夊瓧娴嬭瘯 (Hex: E6 B1 89 E5 AD 97 E6 B5 8B E8 AF 95)


并且我们用 IE4.0 顺利地看到了“UTF-8汉字测试”这几个字。遗憾的是不论你选择什么字体,而 PWindows 95 下的 Netscape 4.05 总是显示一些小方框和“UTF-8”。直到我们启动 NJWIN 选择“Option/Standard English/Western” 才看到正确的汉字。这实在令人失望。
因此,在文字处理方面有缺陷的是 Netscape 而不是 IE。另外,互联网一些上关于 HTML 国际化方面的资料中也有关于浏览器对 Unicode 等国际化问题的评测,其结论也是一致的。如:Notes on Internationalization ( http://ppewww.ph.gla.ac.uk/~flavell/charset/internat.html ) 、HTML Internationalization: Browser tests of 8-bit character codes (http://ppewww.ph.gla.ac.uk/~flavell/charset/i18n-browser-tests.html) 等。文中通过 koi8-r 和 Greek 等 charset 对 Tango (2.7.1)、Lynx 2.6/2.7、 IE 3.01 欧洲版、IE 3.03、IE 4.0、NS Nav 3.03、NS C 4.04 做了对比,只有 MSIE 通过了全部测试。
虽然我们指定了 gb2312 或 gb_2312-80 的时候,MS IE 和 NS Nav 对汉字的解释结果是类似的,但是,Netscape 对欧洲字符的解释却是混乱的,大部分字符被简单地解释成为问号,这和“Notes on Internationalization ”文中指出的问题是一样的。把欧洲字符解释成汉字,仅仅是一种巧合,这是操作系统或汉字平台在字符显示上的作用,尽管 Netscape 在内部用了很多技巧来实现多语种的实现,但是它的实现是不规范的,带来的问题比它表面上的好处要严重。
另外,通过我们前面的分析可以看到,我们谈论的 HTML 中的汉字代码与 Unicode 的关系是 GB或BIG5 与 Unicode 转换码的关系,而不是 Unicode 汉字编码。
一个好的中文网点,应采用规范的 (指定gb_2312-80或gb2312,并保证汉字在 HTML 源码中是汉字,而不是与号分号序列表示)方法,才能保证更多的人能够阅读你的网页。关于这方面的内容参见“乱码大全”(9)(10)中的详细叙述。