乱码大全(8)──Quoted-Printable

来源:百度文库 编辑:神马文学网 时间:2024/04/30 18:35:19
乱码大全(8)──Quoted-Printable 

  先认一认,一定很熟悉了,常见的被称为乱码的东西。 经常出现在 email 中, 这就是 Quoted-Printable,是 MIME 的另一种编码方式。 

   =A1=B0=C2=D2=C2=EB=B4=F3=C8=AB=A1=B1=A3=AC=D7=F7=D5=DF bluesea =A3=AC=CB=AE=C4=BE=C7=E5=BB=AABBS=B3=C9=D4=B1=A1=A3=BB=B6=D3=AD=D4=DA BBS=D6=D0=D7=AA=D4=D8=A3=AC=B0=EF=D6=FA=BC=C6=CB=E3=BB=FA=B3=F5=D1=A7 =D5=DF=BD=E2=BE=F6=CA=B9=D3=C3=C8=ED=BC=FE=B9=FD=B3=CC=D6=D0=D3=F6=B5=BD =B5=C4=CA=B5=BC=CA=CE=CA=CC=E2=A1=A3=B1=BE=CE=C4=D4=AD=D4=D8=D3=DA =CB=AE=C4=BE=C7=E5=BB=AA BBS =B5=C4 Internet =CC=D6=C2=DB=C7=F8=A1=A3

  在所有邮件处理的各式各样的编码中,很多编码的目的都是通过编码手段使得七位字符的邮件协议体系可以传送八位的二进制文件、双字节语言文字等等。 Quoted-Printable 也是这样一些编码中的一个,它的目的同样是帮助非 ASCII 编码的信件传输通过 SMTP。Quoted-Printable 编码是字符对应的编码,每个未编码的二进制字符被编码成三个字符,即一个等号和一个十六进制的数字,如 “=A8”。1:3,这种编码效率实在很低。有关 Quoted-Printable 详细技术信息可以参考 RFC 2045。

  一些 email 程序,它们不能正确解释这种编码。最方便的方法是使用 (如 Forward 到) 支持Quoted-Printable 解码的 email 程序如 Netscape、Eudora、 OutLook Express 和 Calypso 2.4 等。Calypso 在将邮件另存成纯文本的时候,甚至全都采用的是 Quoted-Printable 格式。Winzip 仍然是最方便的解码工具之一。 

  用 Winzip 对 Quoted-Printable 解码的关键有两条:(1) 在email 信头中检查、添加这样的两行,如果没有信头,那么这两行就构成信头,比如这两行可以添加到本文开始的那段例子前面。

Mime-Version: 1.0 
Content-Transfer-Encoding: quoted-printable

  (2) 信头中间不要空行,信头和信体之间要有一个空行。这样形成的文件,改后缀名为 UUE,即可双击启动 Winzip 得到解码。email 中的标题或收发信人等信头位置带有的 quoted-printable 编码都可以被一起解决。满足上面条件的信件也可以改后缀名为 EML, 用 OutLook Express 来解码,类似这样的标题:
  Subject: =?gb2312iso-8859-1?Q?=D4=DA=C7=E5=BB=AA=B5=C4BBS=C9=CF?=
  Subject: =?gb2312?Q?=D4=DA=C7=E5=BB=AA=B5=C4BBS=C9=CF?=
也可以被 OutLook Express 正确复原。

  与 BASE64 不同的是 Quoted-Printable 编码不处理原文中的换行,因此要注意一个汉字是由两个字符组成的,会对应于 Quoted-Printable 编码的六个字符,如果经过重新编辑并且换行不当则会造成半个汉字的乱码,需要相应调整。

  除此之外,还有很多方法用于解决 Quoted-Printable 的解码,例如著名的 Quick View Plus 4.5 ( http://www.inso.com ) 也支持 Quoted-Printable 的解码和直接阅读。有些网点以在线 CGI 方式提供 Quated-printable 解码,例如:

  http://cactus.aist-nara.ac.jp/~yosita-h/jap/quote.html

  在 Unix 中,被 BASE64 或 quoted-printable 编码的邮件可以用 metamail 等方法来解决。下面这份程序是本 BBS 的 jyj 编写的,现在收录在 Networking 板的精华区中,用于quoted-printable 解码,适合于 Unix/DOS/windows。本文引用时对源程序的版式做了一些调整。

  #i nclude 
  void main(int argc, char * argv[])
  {
   FILE * fp; char ch, ch1, ch2; unsigned char hz;
   fp = fopen(argv[1], "rt");
   for (;;) {
   ch = getc(fp); if (ch == EOF) break;
   if (ch == ‘=‘) {
   ch1 = getc(fp); if (ch1 == ‘\n‘) continue;
   ch2 = getc(fp);
   hz = (ch1>‘9‘?ch1-‘A‘+10:ch1-‘0‘)*16+
   (ch2>‘9‘?ch2-‘A‘+10:ch2-‘0‘);
   putchar(hz);
   }
   else putchar(ch);
   }
   fclose(fp);
   }

  在 http://www.kobira.co.jp/sakura/d_net_mail.htm 可以获得 Quoted- Printable 编码和译码的 Pascal 源程序。很多支持 MIME 编解码的程序都提供了 MIME BASE64 或 Quoted-Printable 的源程序