“B?”到“?=”之间的内容既是,base64编码的。

解决方案 »

  1.   

    电子邮件中的内容,涉及到2种编码概念:(1). 字符编码(Char Encoding)。把 "字符串" => "字节串" 的编码
    (2). 传输编码(Content-Transfer-Encoding)。把 "字节串" => "另一个字节串" 的编码
    (需要注意 "字符" 与 "字节")这部分内容的形成过程是:
    "中文" => 通过GB2312 => 得到字节串 char[4]
    char[4] => 通过 Base64 => 得到另一个字节串 "u7vTys/kwcsgIM2s1r7Dxw=="(举例)最后写成 =?   gb2312  ?  b  ?   u7vTys/kwcsgIM2s1r7Dxw==      ?=关于这一点的更详细的说明,推荐搂主看一篇文章:
    http://www.regexlab.com/zh/encoding.htm
      

  2.   

    解码过程则相反:
    先 Base64 解码,得到了用 GB2312 编码的字节 char[]。对于 PHP 来讲,不需要再把字节转化成 UNICODE 字符串。只需要直接输出就可以了,因为编码采用的是 gb2312。
    而对于 java 或者 C++ 来说,最好是使用 gb2312 再转化成为 UNICODE 字符串。更多关于 UNICODE 字符串,以及编码的概念:
    http://www.regexlab.com/zh/encoding.htm
      

  3.   

    Subject: =?gb2312?B?u7vTys/kwcsgIM2s1r7Dxw==?=
    对于以上这类只需要取出B?与?=之间的内容,用 base64_decode()即可解码了,非常感谢以上二位的回答我刚才根据sswater提供的文献又看见了另一种编码如果为Q?与?=之间的内容的话,形如下面,可以用quoted_printable_decode()这个函数解码
    Subject: =?GB2312?Q?=D6=D0?=
      

  4.   

    搂主还需要注意的是,如果前页面不是 gb2312 ,解码后直接显示可能显示不出正确的汉字。搂主可以借此机会进一步了解一下 UNICODE 的概念。如果前面是 utf8,而搂主的当前页面是 gb2312 ,那么可能需要进行编码的转换才能正常显示。比如:假设: =?utf8?Q?=AB=CD=34?=,而页面是 charset=gb2312
    那么,需要进行的操作是:
    1. decode 得到 char[] // 用 utf8 编码的
    2. 通过 '字节' => utf8编码 => 'UNICODE 字符'
    3. 通过 'UNICODE 字符' => gb2312 => '字节' // 得到 gb2312 编码的
    4. 显示最终得到的 '字节串'