`

中文化和国际化问题权威解析之六:MIME编码/字符传输编码

 
阅读更多

MIME(Multipurpose Internet Mail Extensions) 是"多用途Internet邮件扩充协议"的缩写,在 MIME 协议之前,邮件的编码曾经有过 UUENCODE 等编码方式 ,但是由于 MIME 协议算法简单,并且易于扩展,现在已经成为邮件编码方式的主流,不仅是用来传输 8 bit 的字符,也可以用来传送二进制的文件 ,如邮件附件中的图像、音频等信息,而且扩展了很多基于MIME 的应用。

当一段Text或者HTML通过电子邮件传送时,发送的内容首先通过一种指定的字符编码转化成"字节串",然后再把"字节串"通过一种指定的传输编 码(Content-Transfer-Encoding)进行转化得到另一串"字节串"。比如,打开一封电子邮件源代码,可以看到类似的内容:
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: base64
sbG+qcrQuqO17cf4yee74bGjz9W7+b3wudzA7dbQ0MQNCg0KvPKzxqO6uqO17cnnsaPW0NDEDQoNCg==

最常用的 Content-Transfer-Encoding 有 Base64 和 Quoted-Printable 两种,另外还有一种叫BinHex,基本上是Mac专用。在对二进制文件或者中文文本进行转化时,Base64 得到的"字节串"比 Quoted-Printable 更短。在对英文文本进行转化时,Quoted-Printable 得到的"字节串"比 Base64 更短。因为Base64是对所有的字符(包括ASCII码)进行重新编码,而QP只针对非ASCII码进行编码。

对于邮件的标题,MIME用了一种更简短的格式来标注"字符编码"和"传输编码"。比如,标题内容为 "中",则在邮件源代码中表示为:Subject: =?GB2312?B?1tA=?=
其中:
第一个"=?"与"?"中间的部分指定了字符编码,在这个例子中指定的是 GB2312。
"?"与"?"中间的"B"代表 Base64。如果是"Q"则代表 Quoted-Printable。
最后"?"与"?="之间的部分,就是经过 GB2312 转化成字节串,再经过 Base64 转化后的标题内容。

如果"传输编码"改为 Quoted-Printable,同样,如果标题内容为 "中",则邮件源码为:
Subject: =?GB2312?Q?=D6=D0?=

下面就主要介绍下两种传输编码Base64、QP;

Base64

按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。

为什么要使用Base64?
在设计这个编码的时候,我想设计人员最主要考虑了3个问题:
1.是否加密?
2.加密算法复杂程度和效率
3.如何处理传输?

加密是肯定的,但是加密的目的不是让用户发送非常安全的Email。这种加密方式主要就是"防君子不防小人"。即达到一眼望去完全看不出内容即可。
基 于这个目的加密算法的复杂程度和效率也就不能太大和太低。和上一个理由类似,MIME协议等用于发送Email的协议解决的是如何收发Email,而并不 是如何安全的收发Email。因此算法的复杂程度要小,效率要高,否则因为发送Email而大量占用资源,路就有点走歪了。
但是,如果是基于以上 两点,那么我们使用最简单的恺撒法即可,为什么Base64看起来要比恺撒法复杂呢?这是因为在Email的传送过程中,由于历史原因,Email只被允 许传送ASCII字符,即一个8位字节的低7位。因此,如果您发送了一封带有非ASCII字符(即字节的最高位是1)的Email通过有"历史问题"的网 关时就可能会出现问题。网关可能会把最高位置为0!很明显,问题就这样产生了!因此,为了能够正常的传送Email,这个问题就必须考虑!所以,单单靠改 变字母的位置的恺撒之类的方案也就不行了。关于这一点可以参考RFC2046
基于以上的一些主要原因产生了Base64编码。

Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。也就是说,转换后的字符串理论上将要比原来的长1/3。实例如下:
转换前 aaaaaabb ccccdddd eeffffff
转换后 00aaaaaa 00bbcccc 00ddddee 00ffffff
上面的三个字节是原文,下面的四个字节是转换后的Base64的二进制编码,其前两位均为0。 至此编码还没完成,转换后,我们还要用一个码表来得到我们想要的字符串(也就是最终的Base64编码),编码表(摘自RFC2045 )如下:

 

Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y

注意:码表最后的pad是专门用来在文档最后进行填充的,因为并非所有文档的字节数都是3的整数倍,如果遇到除不尽的情况,就用=来填充;

QP(Quote-Printable)

其原理是把一个 8 bit 的字符用两个16进制数值表示,然后在前面加"="。所以我们看到经过QP编码后的文件通常是这个样子:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1。

与Base64相比,QP的保密性要相对较低,因为他不对ASCII码进行重复编码,这样对于普通英文文档就相当于没有编码过,文档内容是完全可见的;这样也带来一个优势,就是对于英文字符占多数的文档编码后文件大小不会增加太多;

分享到:
评论

相关推荐

    rfc2046_zh.txt

    - **编码转换**:MIME还定义了content-transfer-encoding字段,用于指示消息体如何进行编码传输,以确保各种字符集和媒体类型能够正确地在网络上传输。 - **媒体类型详解**: - **text/**:文本类型,包括纯文本和...

    ClodFusion 的中文问题解决

    - **国际化和本地化**:对于支持多语言的网站,可以考虑使用 i18n(国际化)和 l10n(本地化)技术,这样可以更方便地管理和切换不同语言版本。 - **数据库配置**:数据库字段也需要配置正确的字符集,以存储和检索...

    解决邮件乱码问题

    常见的邮件编码主要有两种:MIME编码(Multipurpose Internet Mail Extensions)和字符集(Character Set)。MIME编码用于处理非纯文本的邮件内容,如图片、附件等,而字符集定义了字符的表示方式,如ASCII、UTF-8等...

    解决fck上传中文名的图片乱码的问题

    例如,如果服务器采用GBK编码,而FCKeditor使用的是UTF-8,那么中文字符在传输过程中可能会出现无法正确解析的情况,表现为乱码。 解决这个问题的方法主要有以下几个步骤: 1. **检查FCKeditor配置**:确认...

    邮件转吗代码

    在IT领域,尤其是在电子邮件处理与编码技术中,“邮件转吗代码”这一概念涉及到邮件编码、解码以及...通过理解并正确应用MIME编码标准,开发者可以构建出更加健壮、兼容性强的邮件发送系统,满足日益增长的国际化需求。

    彻底解决httpClient乱码问题

    在处理中文字符时,由于编码不一致或者处理不当,往往会出现乱码现象。以下是一些关键的知识点和解决方案: 1. **字符编码设置**:HttpClient默认可能不会自动处理服务器返回的字符集,因此需要明确指定编码。在...

    rfc2045 2046 2047 中文

    在电子邮件早期,ASCII字符集是主要的通信标准,但随着全球化的推进,需要支持更多语言和非ASCII字符。MIME扩展了这一标准,允许在邮件中包含图像、音频、视频等不同类型的多媒体内容,并且支持非英文字符集,如中文...

    rfc2046中文资料

    MIME 是对传统基于 US-ASCII 编码的电子邮件格式的一种扩展,旨在解决非 ASCII 字符集、多媒体数据和其他非文本数据的传输问题。通过 MIME,可以实现图像、音频、视频等多种类型的数据在电子邮件中的传输。 #### 二...

    网页获取JSON中文返回乱码解决方案(java + js)

    总结来说,解决JSON中文乱码问题的关键在于确保JSON数据从生成到传输再到解析的整个过程中,始终使用UTF-8编码。在Java后端,要使用UTF-8编码生成JSON字符串,并在HTTP响应中设置正确的Content-Type;在JavaScript...

    php_manual_zh-PHP中文手册(2010-08-16).part1.rar

    国际化与字符编码支持 图像生成和处理 邮件相关扩展 数学扩展 非文本内容的MIME输出 进程控制扩展 其它基本扩展 其它服务 搜索引擎扩展 面向服务器的扩展 Session 扩展 文本处理 与变量和类型有关的扩展 Web ...

    php_manual_zh-PHP中文手册(2010-08-16).part2.rar

    国际化与字符编码支持 图像生成和处理 邮件相关扩展 数学扩展 非文本内容的MIME输出 进程控制扩展 其它基本扩展 其它服务 搜索引擎扩展 面向服务器的扩展 Session 扩展 文本处理 与变量和类型有关的扩展 Web ...

    rfc2046 中文版

    1. **实际应用**:**MIME**的应用非常广泛,几乎所有现代电子邮件系统都支持**MIME**格式,从而实现了电子邮件的多媒体化和国际化。 2. **未来展望**:随着技术的发展,**MIME**也在不断演进,以适应更多样化的应用...

    Email解析程序

    此外,程序可能还需要处理编码问题,比如MIME(Multipurpose Internet Mail Extensions)编码,它允许在邮件中包含非ASCII字符,如中文或其他语言,以及各种类型的附件。 "测试通过"和"编译通过"表明这个Email解析...

    发送邮件及邮件附件java代码实例

    - `contentTransferEncoding`: 传输编码方式。 - `contentDisposition`: 内容描述。 - `content`: 邮件正文。 - `partSet`: 邮件单元的集合,包含正文和所有附件。 - **调试与控制**: - `isDebug`: 是否开启...

    JAVA_API1.6文档(中文)

    java.util 包含 collection 框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。 java.util.concurrent 在并发编程中很常用的实用工具类...

    HL7 V2.4 中文文档参考大全

    它不仅包含了英文版的所有功能,还特别考虑了中文字符的处理和中国医疗体系的特色,如中医数据的标准化、符合中国法规的医疗编码体系等。这使得中国的医院和医疗软件开发者可以根据这套标准开发出符合国情的医疗信息...

    邮件客户端

    MIME编码确保了这些非文本数据能在邮件系统中正确传输和解析。 5. 开发环境文件:Email.dsw、Email.ncb和Email.opt是Microsoft Visual Studio的项目文件,它们分别代表工作空间文件、调试信息文件和项目选项文件,...

    python常用的库大全

    19. **phonenumbers**:用于解析、格式化、存储和验证国际电话号码的库,广泛应用于通信应用程序。 20. **python-user-agents**:解析浏览器用户代理(user-agents)的库,常用于Web分析或服务器端应用。 21. **...

    OpenPOP修正版

    修正版OpenPOP针对这一问题进行了优化,采用了正确的编码策略来解析邮件内容,确保了中文字符在传输和显示过程中的正确性。这通常涉及到对邮件头和邮件体的编码识别,如使用UTF-8编码进行解码,以及处理MIME编码的...

Global site tag (gtag.js) - Google Analytics