在接收电子邮件时有时会发现邮件中的内容一片混乱,无法阅读。这主要是发、收邮件的编码和解码方式不统一造成
的。本文介绍乱码生成的原理,并使用常用的收发E-mail的工具成功地模拟出各种编码方式造成的乱码,同时给出了各
种方法来正确阅读这些乱码。
一、一般原理
由于历史原因,Internet上有些邮件系统只支持7位的ASCII字符传输,而汉字的内码是8位的,当在
电子邮件中间发送中文时,如果经过这些只支持7位字符的邮件系统,便会将汉字内码的第8位的1全部变为0。因此早期国
内和国外之间发送中文电子邮件时,有的没有经过7位的邮件系统,便可以直接用中文通信。而有的经过了7位的邮件系统,
邮件内容便乱七八糟,只有高手通过编程将字符的第8位重新变为1才可以阅读。
除了中文邮件外,通过E-mail传送一些二进制文档,如图片、可执行程序及压缩文件等也涉及这个问题。在电
子邮件中一般采用各种邮件编码方式来解决这个问题,将8位的文字预先按照一定的规则进行编码,便可以完好地通过只支持
7位字符的邮件系统了。
一般情况下,各种新的电子邮件工具都可以自动进行解码。但如果发送方用某种编码方式发送了邮件,而接收方电子
邮件工具设置不同,这时就无法正常阅读,需要调整设置选项。此外,如果接收方没有对应的解码工具,或者接收方用的是另
外一种解码工具,也同样无法正常阅读。还有一种情况是发送方从其他系统中转发了编码过的内容给你,这时电子邮件工具只
能将原编码过的内容原封不动地显示出来,用户需要手工将编码剪贴下来,作相关的处理。
此外,不同的汉字编码如GB码、BIG5、HZ等之间也会生成乱码。这可通过支持不同内码的汉字系统来正确显
示。
二、实战环境
实战环境在中文Windows98上,安装了微软的OutLook Express和Netscape Co
mmunicator软件。拥有一个E-mail帐号,可以通过Telnet方式登录。本文在这个环境下实现E-ma
il乱码的再现,并给出了解决示例。
您的实际环境可能和其稍有区别,但不要紧,本文对一种乱码介绍了多种再现和解决方法,总有一种会类似您的环境
。
三、大战Quoted-Printable编码
1.认识Quoted-Printable编码
其外观类似“=C2=D2=C2=EB= D4=AD=C0=ED=BA=CD=CA=B5=D5=BD=
D1=DD=CF=B0”。它将一个8位的字符表示为3个字符:一个“=”和两个十六进制数。由于汉字编码一般以两个
8位表示一个汉字,所以该编码中表示一个汉字需要6个字符。如该例子中的“=C2=D2”表示“乱”字,“=C2=E
B”表示“码”字。
2.生成Quoted-Printable编码
我们可以用各种武器再现Quoted-Printable编码,你可以根据你的环境用下面方法中的一种生成Q
uoted-Printable编码的邮件,然后就可以用后续介绍的方法看到乱码的真面目。
武器1:OutLook Express
首先要设置武器。在OutLook Express中选择“工具/选项”菜单,在出现的对话框中点击“发送”
页,出现图1对话框。
在“邮件”发送格式下点击“纯文本”,并点击其右端的“设置”按钮,出现图2,在其中的“文本的编码方式”后
选中“Quoted Printable”,点击两次确定。回到OutLook Express主菜单。此时,你的武
器已经可以生成Quoted Printable编码了。
点击“新邮件”按钮,出现发送邮件的窗口,输入邮件内容。(为了自己能够收到,可在收件人地址中输入自己的E
-mail地址)。在点击“发送”之前确保选中“格式/纯文本”和“格式/语言/简体中文/gb2312”。如图3。
点击发送,一个Quoted Printable编码的邮件就发出去了。
武器2:Netspcae Mail
首先设置武器,选择“Edit/Preference”菜单,展开“Mail& Groups”,点击“Me
ssages”,出现图4。
点击其中的“More Options”按钮,在图5对话框中选中“Using the‘qutoted p
rintable’ MIME encoding”选项。
点击数次OK按钮,武器设置完毕。
在Netscape Mail的主菜单中,点击“New Msg”按钮,不需要再作其他设置,同上将自己设置
为收信人,并输入邮件标题和内容,发送后,一个同样的Quoted Printable编码的邮件就发出去了。
3.查看Quoted-Printable编码原文
现在我们可以查看一下前面的Quoted-Printable编码的邮件是何面目。根据你的环境,可以使用如
下武器之一。
武器1:Telnet
直接Telnet到Unix系统E-mail服务器上,输入帐号密码后进入E-mail服务器的提示符。输入
mailx命令,出现各个邮件标题。输入“more邮件号”,可以看到邮件内容。对话过程如下所示:其中,黑体为输入
内容,其余为显示内容,所有输入字母均为小写。
UNIX(r) System V Release4.0(yc)
login: xyx
Password:
Last login: Tue Aug2419:20:17 from202.120.127.202
Sun Microsystems Inc. SunOS5.4 Generic July1994
You have mail.
yc% mailx
mailx version5.0 Fri Jul1521:21:05 PDT1994 Type? fo
r help.
"/var/mail/xyx":2 messages1 new2 unread
U1 xu Tue Aug2420:0225/750=?gb2312?B?wtLC6w==?=
>N2 Xu Yingxiao Tue Aug2420:1120/667=?gb2312?B?wtLC
6w==?=
? more1
Message1:
From xyx@yc.shu.edu.cn Tue Aug2420:02 CDT1999
From:"xu"
To:
Subject:=?gb2312?B?wtLC6w==?=
Date: Tue,24 Aug199919:03:01+0800
Mime-Version:1.0
charset="gb2312"
Content-Transfer-Encoding: quoted-printable
X-Priority:3
X-Msmail-Priority: Normal
X-Mimeole: Produced By Microsoft MimeOLE V4.72.3110
.3
=B5=E7=D7=D3=D3=CA=B C=FE=C2=D2=C2=EB=D4=A D=C0=ED=
BA=CD=CA=B5=D5=BD=D1= DD=CF==B0
其中的“=B5=E7=D7=D3=D3=CA=BC=F E=C2=D2=C2=EB=D4=AD=C0=
ED=BA=CD=CA=B5=D5= BD=D1=DD=CF==B0”即为“电子邮件乱码原理和实战演习”的Qu
oted-Printable编码。
武器2:Netscape Mail
使用Netscape Mail接收上面所发的电子邮件。有可能因为Netscape Mail功能强大,已
经将编码正确解码了,“电子邮件乱码原理和实战演习”几个字赫然在目。不过我们可以选中邮件看邮件时再选择Netsc
ape Mail的“View/Page Source”菜单,则其马上露出本来面目,如图6。
武器3:OutLook Express
使用OutLook Express接收上面所发的电子邮件。可能同样很不幸,OutLook Expres
s也将其编码正确解码了,“电子邮件乱码原理和实战演习”几个字赫然在目。
OutLook Express没有类似Netscape Mail的“View/Page Source”
菜单,但是我们可以在选中邮件看邮件时再选择OutLook Express的“文件/另存为”菜单,在出现的对话框
中选择保存目录,输入文件名,保存类型选择“邮件(*.eml)即可。然后使用普通的文本编辑器如NotePad打开
这个以.eml为后缀的文件。一个和图7同样的内容便出现了。
也可以在邮件标题上点击邮件,选择“属性”菜单,在出现的窗口中点击“详细资料”,如图7,再点击其中的“邮
件的源文件”即可。
4.解决Quoted-Printable编码
前面我们已经看到OutLook Express和Netscape Mail都可以自动对Quoted-P
rintable进行解码。但若你的软件未设置好,或你原先使用的是Telnet工具或收到的是别人转发过来的邮件。
则仍会出现乱码,发生不能正确阅读的情况。
我们可以使用以下武器来解决之。
武器1:OutLook Express
如果是软件设置问题,可以在OutLook Express中选择“查看/语言/简体中文(GB2312)”
即可,如图8。你也可以选择其他如“通用字符(UTF-8)”,便会发现无法阅读。
如果邮件是别人转发过来的,或你用的是其他电子邮件工具,只能看到形如“=B5=E7=D7=D3=D3=C
A=BC=FE=C2=D2=C2=EB=D4=AD=C0=ED=BA=CD=CA=B5=D5=BD=D1=DD
=CF==B0”的本来面目,这时可以将这段代码粘贴到文本编辑器中,并在其前面加入一段文本,形成如图9的内容。
注意,在“Content-Transfer-Encoding:quoted-printable”下要留
有一行空行。
将这段文本用文本格式下来,文件名后缀为.eml,目录任意。然后在Windows“我的电脑”或文件管理器
中找到该文件,双击之,将自动启动OutLook Express打开它。
武器2:Netscape Mail
如果是软件设置问题,在Netscape中只要选择“View/Encoding/Simplifed Ch
inese(GB2312)”即可。如图11。
你也可以选择其他如“通用字符(UTF-8)”,便会发现无法阅读。
如果邮件是别人转发过来的,或你用的是其他电子邮件工具,也可以使用图10所示方法,将其保存为某个文件如文
件名为:xyxtest.txt。但第一行需增加一行“From-”,如图12。
文件后缀可有可无,保存在哪个目录要看Netscape Mail的设置。可以在图4的界面中点击“Mail
Server”,再在右端点击“More Options...”按钮。在出现的对话框中查看“Local mail
”后的目录项。如对于图13的设置,应该将文件保存在c:\xyx目录下。
将Netscape Communicator关闭并重新运行,则与Inbox并列出现一项“xyxtest
.txt“,选中该项将出现邮件内容。
武器3:DOS下汉字输入工具
可以使用DOS下的汉字输入工具手工识别Quoted-Printable编码,如对前文的“=B5=E7=
D7=D3=D3=CA=BC= FE=C2=D2=C2=EB=D4=AD=C0=ED=BA=CD=CA=B5=
D5= BD=D1=DD=CF==B0”,以开头几个“=B5=E7=D7=D3”转换为十进制,为:“=181=
231=215=211”。在DOS下的汉字输入状态下,按住“ALT”键,按动键盘右端小键盘的数字键,输入“18
1”,抬起“ALT”,再按住“ALT”键,按动键盘右端小键盘的数字键,输入“231”,则屏幕上出现解码后的第一
个字“电”,以此类推,可以识别所有内容。
四、大战UTF-7编码
1.认识UTF-7编码
其外观类似“+dTVbUJCuTvZ OcXgBU590BlSMW55iGG8UTmA-”,每行开头和
结尾都分别有“+”和“-”符号。
2.生成UTF-7编码
武器1: OutLook Express
只要在发送邮件前选择“格式/语言/通用字符(UTF-7)”即可。如图15。
武器2: Netscape Mail
只要先确认在图5的对话框中选中“As is”选项,发送邮件时,先在发送窗口中选择“格式/语言/通用字符
(UTF-7)即可。.查看UTF-7编码原文
武器1:Telnet
同前登录到E-mail服务器上,输入mailx后可以看到邮件内容如下:
yc% mailx
mailx version5.0 Fri Jul1521:21:05 PDT1994 Type? fo
r help.
"/var/mail/xyx":1 message1 new
>N1 xu Sat Aug2817:3024/699=?utf-7?B?K1RuRjRBUS0=?=
? more1
Message1:
From xyx@yc.shu.edu.cn Sat Aug2817:30 CDT1999
From:"xu"
To:
Subject:=?utf-7?B?K1RuRjRBUS0=?=
Date: Sat,28 Aug199916:31:29+0800
Mime-Version:1.0
charset="utf-7"
Content-Transfer-Encoding: quoted-printable
X-Priority:3
X-Msmail-Priority: Normal
X-Mimeole: Produced By Microsoft MimeOLE V4.72.3110
.3
+dTVbUJCuTvZOcXgBU590BlSMW55 iGG8UTmA-
其中的“+dTVbUJCuTvZOcXgBU590Bl SMW55iGG8UTmA-”即为“电子邮件乱
码原理和实战演习”的UTF-7编码。
武器2:OutLook Express
使用OutLook Express接收上面所发的电子邮件,在OutLook Express中选择“查看
/语言/简体中文(GB2312)”即可看到编码内容。
也可以在选中邮件看邮件时再选择OutLook Express的“文件/另存为”菜单,在出现的对话框中选
择保存目录,输入文件名,保存类型选择“邮件(*.eml)即可。然后使用普通的文本编辑器如NotePad打开这个
以.eml为后缀的文件。
或在邮件标题上点击邮件,选择“属性”菜单,在出现的窗口中点击“详细资料”,再点击其中的“邮件的源文件”
即可。
武器3:Netscape Mail
在如图11选中邮件看邮件时,选择Netscape Mail的“View/Encoding/Simpli
fed Chinese(GB2312)”即可直接看到乱码内容。此时选“View/Page Source”菜单也
同样可以看到其内容。
4.解决UTF-7编码
OutLook Express和Netscape Mail都可以对Quoted-Printable进行
解码。但若你的软件未设置好,或你原先使用的是Telnet工具或收到的是别人转发过来的邮件。则仍会出现乱码发生不
能正确阅读的情况。
我们可以使用以下武器来解决之。
武器1:OutLook Express
在OutLook Express中选择“查看/语言/通用字符(UTF-7)”即可看到解码后的内容。
如果邮件是别人转发过来的,或你用的是其他电子邮件工具,只能看到编码内容,也可将编码内容剪贴下来,并在前
面加上一段,形成如下内容:
From:
To:
Subject:
Mime-Version:1.0
Content-Type:text/plain; charset="utf-7"
Content-Transfer-Encoding:7bit
+dTVbUJCuTvZOcXgBU590BlSMW55iGG8UTmA-
将这段文本用文本格式下来,文件名后缀为.eml,目录任意。然后在Windows“我的电脑”或文件管理器
中找到该文件,双击之,将自动启动OutLook Express打开它,选“查看/语言/通用字符(UTF-7)”
即可看到解码后的内容。
武器2:Netscape Mail
选择Netscape Mail的“View/Encoding/Unicode(GB2312)”即可。也
可如前所示编码,剪贴下来后,加上一段,并在第一行加上一行“From-”,用Netscape Mail来查看。
五、大战HZ编码
1.认识HZ编码
其外观类似“电子邮件乱码原理和实战演习”,它是一种屏蔽了最高位的汉字
表示方法,每行开头和结尾都分别有“”和“”符号。
2.生成HZ编码
武器:OutLook Express
只要在发送邮件前在图1的界面中选择“格式/语言/简体中文(HZ)”即可。
3.查看HZ编码原文
武器1:Telnet
同前登录到E-mail服务器上,输入mailx后可以看到邮件内容如下:
yc% mailx
mailx version5.0 Fri Jul1521:21:05 PDT1994 Type? fo
r help.
"/var/mail/xyx":1 message1 new
>N1 xu Sun Aug2910:3023/672=?hz-gb-2312?B?fntCUkJrf
n
? more1
Message1:
From xyx@yc.shu.edu.cn Sun Aug2910:22 CDT1999
From:"xu"
To:
Subject:=?hz-gb-2312?B?fntCUkJrfn0=?=
Date: Sun,29 Aug199909:23:13+0800
Mime-Version:1.0
charset="hz-gb-2312"
Content-Transfer-Encoding: quoted-printable
X-Priority:3
X-Msmail-Priority: Normal
X-Mimeole: Produced By Microsoft MimeOLE V4.72.3110
.3
电子邮件乱码原理和实战演习
其中的“电子邮件乱码原理和实战演习”即为“电子邮件乱码原理和实战演习
”的HZ编码。
武器2:OutLook Express
同前述UTF-7编码查看方法。
武器3:Netscape Mail
在如图11选中邮件看邮件时,选择Netscape Mail的“View/Encoding/User D
efined”即可直接看到乱码内容。此时选“View/Page Source”菜单也同样可以看到其内容。
4.解决HZ编码
武器1:OutLook Express
在OutLook Express中选择“查看/语言/简体中文(HZ)”即可看到解码的内容。 若剪贴下来
,可在其前面加上一段后内容如下:
From:
To:
Subject:
Mime-Version:1.0
charset="hz-gb-2312"
Content-Transfer-Encoding:7bit
电子邮件乱码原理和实战演习
武器2:Netscape Mail
选择Netscape Mail的“View/Encoding/Simplifed Chinese(GB
2312)”即可。
若剪贴下来处理,则同前增加一行“From-”。
六、大战BASE64编码
1.认识BASE64编码
一般以附件发出的各种文件都使用这种编码。其内容是一大堆杂乱无章但都可以正常显示的ASCII字符。邮件头
上有“Content-Transfer-Encoding: base64”字样。
2.生成BASE64编码
武器1:OutLook Express
在图2“文本的编码方式”后选中“Base64”,点击两次确定。回到OutLook Express主菜单
。此时,输入的邮件内容将以Base64编码方式发出。
也可将要发送的内容写入文件,文件名以.exe为后缀,如保存在m5.exe文件中,然后通过附件方式发出。
武器2:Netscape Mail
同上将要发送的内容写入文件,文件名以.exe为后缀,如保存在m5.exe文件中,然后通过附件方式发出。
3.查看BASE64编码原文
武器1:Telnet
同前登录到E-mail服务器上,对于使用OutLook中第一种方法发出的邮件,可以看到邮件内容如下:
Message1:
From xyx@yc.shu.edu.cn Sun Aug2911:08 CDT1999
From:"xu"
To:
Subject:=?gb2312?B?wtLC6w==?=
Date: Sun,29 Aug199910:09:25+0800
Mime-Version:1.0
charset="gb2312"
Content-Transfer-Encoding: base64
X-Priority:3
X-Msmail-Priority: Normal
X-Mimeole: Produced By Microsoft MimeOLE V4.72.3110
.3
tefX09PKvP7C0sLr1K3A7brNyrX VvdHdz7ANCg==
对于用附件发出的邮件,也可看到类似内容。其中的“tefX09PKvP7C0sLr1K3A7brNyrX
VvdHdz7ANCg==”即为“电子邮件乱码原理和实战演习”的Base64编码。
武器2:OutLook Express
类似前述UTF-7编码查看方法,可用另存或属性菜单看到Telnet方法所看到的相同内容。
武器3:Netscape Mail
类似前述UTF-7编码查看方法,选“View/Page Source”菜单看到其内容。
4.解决BASE64编码
OutLook Express和Netscape Mail都可以自动对Base64进行解码,如果使用的
是附件方式,则可将附件保存后打开查看。也可以剪贴下来,加上如前解决HZ编码类似的信息(将其中的“Content
-Transfer-Encoding:7bit”改为“Content-Transfer-Encoding: b
ase64”),保存后用OutLook Express或Netscape Mail查看。
七、大战Uuencode编码
1.认识Uuencode编码
在一堆杂乱的字符首行有“begin…”字样,结尾处有“end”字样。
2.生成Uuencode编码
武器1:OutLook Express
在图2中选中“Uuencode”,点击两次确定。回到OutLook Express主菜单。则以后的附件
将以Uuencode编码方式发出。
如可以将“电子邮件乱码原理和实战演习”保存为m6.txt文件,用附件方式发出。
武器2:Netscape Mail
在发送邮件的界面中,发送前选择“View/Options”菜单,选中“Uuencode instead
of MIME for Attachment”,再点击“Send”发出邮件,则附件将以Uuencode编码方式
发出。
如可以将“电子邮件乱码原理和实战演习”保存为m5.exe文件,用附件方式发出。
武器3:Telnet
许多Unix系统中在提示符下输入“vi m5.txt”,按“i”键开始插入字符,输入“电子邮件乱码原理
和实战演习”,按ESC,再按:wq,存盘退回Unix提示符。输入uuencode m5.txt m5.txt>
m5.en,将邮件内容使用uuencode编码至m5.en文件中。则m5.en中为Uuencode编码内容。可
以将其传到本地计算机,用任何E-mail工具作附件发出,也可使用Unix中发送邮件的命令,如:yc% mail
x xyx@yc.shu.edu.cn
Subject:乱码
~r m5.en
"m5.en"4/61
EOT其中粗体、下划线字体为输入内容,最后按“Ctrl+D”发出邮件。
3.查看Uuencode编码原文
武器1:Telnet
同前登录到E-mail服务器上,对于使用OutLook中第一种方法发出的邮件,可以看到邮件内容如下:M
essage1:
From xyx@yc.shu.edu.cn Sun Aug2911:40 CDT1999
From:"xu"
To:
Subject:乱码
Date: Sun,29 Aug199910:41:32+0800
X-Priority:3
X-Msmail-Priority: Normal
X-Mimeole: Produced By Microsoft MimeOLE V4.72.3110
.3
begin666 m6.txt
?7T]/*O/["TL+KU*W [;K-RK75O='=S[-"@``
end
其中“begin”至“end”之间的内容即为“电子邮件乱码原理和实战演习”的Uuedncode编码。
武器2:OutLook Express
类似前述UTF-7编码查看方法,可用另存或属性菜单看到Telnet方法所看到的相同内容。
武器3:Netscape Mail
类似前述UTF-7编码查看方法,选“View/Page Source”菜单看到其内容。
4.解决Uuencode编码
OutLook Express和Netscape Mail都可以自动对Quoted-Printable
进行解码,如果使用的是附件方式,则可将附件保存后打开查看。
如果使用的是Telnet工具收发E-mail,也可以使用uudecode工具将其解码,如下:
yc% mailx
mailx version5.0 Fri Jul1521:21:05 PDT1994 Type? fo
r help.
"/var/mail/xyx":1 message1 new
>N1 xu Sun Aug2912:0725/605乱码
? s1 m
"m" [New file]25/605
? x
yc% uudecode m
yc% more m6.txt
电子邮件乱码原理和实战演习
其中将邮件保存为文件名m,然后用“uudecode m”将其解码,解码后即可生成解码后的文件,解码后文
件名和发邮件时的文件名相同,也可通过查看邮件中“begin”后的字符串得到文件名。
八、大战BIG5
类似“环毙厩揭”的文字一般是Big5码。
要再现这种乱码,只要将中文系统设置为Big5码输入方式,将邮件发送出去即可,即使没有支持Big5码的中
文系统,也可以访问一些Big5码的站点,看到Big5码,并可以将其剪贴发送。发送时可将编码方式设置为Big5或
用户自定义方式。
收到这些编码的邮件时,用一些支持多种编码的中文系统,如中文之星、四通利方、南极星等,在其中选择Big5
显示就可以正常显示了。如前面的编码转换成GB码后为“远距离教学课程”。
【相关论坛】 【发表评论】