乱码大全(16)──Unicode(3; UTF-8、Unicode与汉字乱码)
UTF-8, A Transformation Format of Unicode and ISO 10646 (See:ISO/ IEC 10646-1:1993 AMENDMENT 2 (1996). UCS Transformation Format 8(UTF-8). Also See RFC-2044)。
很多应用程序不能直接处理 Unicode 或 UCS-4/UCS-2 中的 16(32) 位字符。如 Unicode 中含有的 \x0、\ 等字符将不能直接用于文件名或 C 字符串等等。 UTF-8 编码进行了这样的处理:它保持 US-ASCII 字符为 US-ASCII,而其他编码要保证高位是 1,在编码序列中还包含了码长信息。UTF-8 是一个不定长度的编码。这样编码的结果是在编码序列中,所有的 US-ASCII 码原来也一定是 US- ASCII 码。(具体意义和方法详见上述资料)
例如下面的邮件将在不支持 UTF-8 编码的邮件程序中显示成乱码:
1: From: "bluesea" <bluesea@163.net>
2: Subject: =?utf-8?B?5rWL6K+V?=
3:
4: 鈥滀贡鐮佸ぇ鍏ㄢ€濓紝浣滆€咃細bluesea锛屾按鏈ㄦ竻鍗?
5: BBS鎴愬憳銆傛杩庡湪 BBS涓浆杞姐€傛湰鏂囧師杞戒簬姘存湪
6: 娓呭崕 BBS 鐨?Internet璁ㄨ鍖恒€?
除了编码中夹带零星的英语单词可以帮助我们判别以外,没有更明显的标志帮助我们识别它是 UTF-8 编码。只能通过猜测和试验来进行。假如我们猜测它属于 UTF-8,那么我们需要在原信头添加下面的信息:
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
注意,上面两行加在原信的第三行处,与原信头不要留空行。然后将被编辑的信件另存为 *.eml 文件,用双击它启动 OutLook Express 即可获得原信的内容。同时这里也提醒一下,如果你拥有支持 UTF-8 编码能力的邮件程序,在用它发信的时候,尽量不要使用这个编码,以免使对方不知所措。
一个不错的汉字代码转换软件: MView Convert 可以把转换 UTF-8 编码的文件转换为 GB 或其他编码的文件。它的下载地址参见 UTF-7 文。
无论 UTF-7、UTF-8 还是我们前面提到的 MIME 或其他什么编码造成的乱码,乱码明文提供的信息未必都是完整的。其实信件的全部内容并没有完整地显示在邮件程序的信体显示窗口中。不同的邮件程序可以通过不同的方法 (如 OutLook Express 是通过选择“属性”/“详细资料”/“邮件的源文件”) 获得的邮件的完整信头,那么我们需要的编码信息往往就在信头中。
上面我们先后解决了 UTF-7、UTF-8 这两种转换码的解码。最后,我们再解决 Unicode 与 GB、BIG5 的相互转换。上面例子提供的信息用 Unicode 表示将是这样的(实际上不应该有换行,只是为观察方便而加上):
.Nqx.Y‘Qh ..O\... b l u e s e a.l4g(n.SN . . B B Sb.TX0.k" 徫W( B B SN-弆弣0.g,e嘢煆}N巐4g( . .n.SN B B S v? I n t e r n e t嫧嫼S:0.
可以看到,Unicode 中,所有的字符都是 16 位的,包括所有的 7位 ASCII 码都被扩充为 16 位。(注意,高位扩充的是零 \x0,上面显示成空格)。这样的代码不再属于传统意义上的文本文件。这些代码可以使用我们介绍的 MView Convert 软件转换成为 GB、BIG5 或其他汉字编码。注意区分转换选择中 UTF-7、 UTF-8 和 Unicode。
“乱码大全”,作者:bluesea,水木清华BBS成员。欢迎在 BBS 中转载,帮助计算机初学者解决使用软件过程中遇到的实际问题。本文原载于水木清华 BBS 的 Internet 讨论区。地址是: telnet://bbs.tsinghua.edu.cn ,WWW访问的地址是 http://bbs.tsinghua.edu.cn 。当下面的条件全部满足时,转载本文可以不经过作者允许:(1) 转载水木清华 BBS 的信头;(2)不修改原文;(3) 转载仅限于各种 BBS 和非商业性质的个人网点。 严禁各种形式的抄袭,严禁非作者将本文或局部用于任何正式出版的刊物。本自然段是全文的一部分。
联系客服