本备忘录状态:
本文为因特网社区提供信息。本文没有指定任何因特网标准。分发本文不受限制。
摘要
Unicode标准,2.0版本, 以及ISO/IEC 10646-1联合定义了一种字符集,它包含了世界上大多数可书写的字符系统。(后文都直接用Unicode一词)。
事实上,因特网邮件(STD 11, RFC 822)目前所支持的仅仅是7-bit的ASCII字符集。MIME(RFC 2045到2049)扩展了网络邮件以支持不同的媒体类型和字符集,也因此能够在邮件信息里支持Unicode了。虽然它确实提供了随着时间而增加的字符集注册的方法,但MIME既没有把Unicode定义为容许的字符集,也没有说明它要怎么编码。
本文档描述了一种Unicode的转换编码,它只使用7-bit的ASCII字节,并且意图在文件由US-ASCII表中字符组成的限定条件下,对人来说是易读的。还说明了在MIME的内容中怎么使用这种转换编码(RFC 1641“在MIME中使用 Unicode”)。
起因
虽然存在着其他的Unicode转换格式,并且也足以在这样的环境下使用(最明显的就是UTF-8,还有UTF-2 or UTF-FSS),但他们都有一个缺点,就是他们使用了128-255这一范围对Unicode编码,超过了US-ASCII的范围。因此,在邮件环境中,8位字节必须要被编码。这要求让文本经历两次连续的编码,让US-ASCII范围以外的字符有一个显著的扩展,这使得非英文的使用者处于非常不利的地步。例如,使用UTF-8和MIME中的Quoted-Printable内容编码方式一起处理,让US-ASCII字符出现在一个字节里,但其 它的字符可能需要9个字节。
概述
UTF-7把Unicode字符编码为US-ASCII的字节,并且用替换序列编码超出范围(0-127)的字符。为了这个目的,US-ASCII 表里的一个字符就要保留作为替换字符使用。大多邮件网关和系统不能处理完整的US-ASCII字符集(例如那些基于EBCDIC的),所以UTF-7包含了在US-ASCII用于编码的预留,以便所有的邮件系统都能兼容。UTF-7应该一般用在7-bit传输的环境中,比如邮件。其他的环境中Unicode或者UTF-8还是
首选的。参见RFC 1641,“在MIME中使用Unicode”整体描述了在MIME中Unicode转换编码的使用。
定义
首先,定义Unicode:
16-bit字符集,Unicode,由"Unicode标准,2.0版本"所定义。这套字符集与国际标准组织的编码ISO/IEC 10646-1一致。 编码后形式为UCS-2;子集为300;实现等级为3,包含对10646+的前7个修正。
注:Unicode 2.0 还进一步说明了这些字符在ISO标准组织以外的使用和交互。事实上,一个有效的10646序列就是一个有效的Unicode序列,反之也是;Unicode 协会提供对序列的解析,而ISO标准组织却一直没有。
然后,定义一些US-ASCII字符子集:
集合D:(直接字符)包含如下的字符(取自RFC 1521,附录B,在RFC 2045中不再出现了):
大写字母A-Z,小写字母a-z,和10个数字0-9,和后面的9个特殊字符(注意:"+"和"-"遗漏了)
字符 ASCII & Unicode值 (十进制)
'' 39
( 40
) 41
, 44
- 45
. 46
/ 47
: 58
? 63
集合O: (可选的直接字符) 包含如下的字符: (注意 "\" 和 "~" 遗漏了):
字符 ASCII & Unicode值 (十进制)
! 33
" 34
# 35
$ 36
% 37
& 38
* 42
; 59
< 60
= 61
> 62
@ 64
[ 91
] 93
^ 94
_ 95
'' 96
{ 123
| 124
} 125
基本原理:有两个字符 "\" 和 "~" 被遗漏了是因为在ASCII表中他们经常被重新定义变量值。
集合B: (更改过的Base64) (RFC 2045)定义的Base64字母表中的字符,除了衬垫字符:"=" (十进制值为 61)。
基本原理: 衬垫字符 "=" 被排除了是因为UTF-7被设计用来在报头字段中使用,就如RFC 2047中的集合4。 因为RFC 2047编码中唯一易读的编码就是"Q",(基于RFC 2045''s Quoted Printable),所以"="不适合使用(没有很多的转义序列)。这很不幸,但是却不可避免。其实,"=" 字符在UTF-7中也可以作为转义字符使用,如果不是使用"+"。
注:所有US-ASCII在Unicode中都是用同样的值,补0扩展到16 bits。
UTF-7 定义:
一个UTF-7流用如下方式使用7-bit US-ASCII字节表示16-bit Unicode字符:
对Unicode使用更改的base64编码时候,可以首先转换Unicode的16bit的数量值为一个字节流。通过把成对中的一个当作单独的值以后,就会转换为字节对。奇数个字节的的文本是错误的形式,ISO1646 字符超过可设定地址范围的部分转换为字节对后也无法编码。
符表。如果字节对超过了ISO10646可寻址范围,就无法对代码点定
位了。
然后,对字节流进行编码时使用了"更改的base64编码"算法(定义于RFC 2045),更改中去掉了衬垫字符"="。在编码时候,增加了代替的"0 bits"以便衬垫base64编码字符的边界。在解码时,在"更改的base64编码"序列最后的一些bits,如果不能组成一个完整的 16-bit的Unicode字符,那么就会被丢弃。如果丢弃的bits不是0,那么这个编码序列就是有格式错误的。
鉴于给定的一组规则,Unicode字符可以经由规则1或者规则3编码,一个字符占用一字节;然后其他的Unicode字符用规则2编码,一个字符占用平均(2 + 2/3)个字节,加上一个转换开关字节用来进入"更改的base64编码",加一个可选的转换跳出字节。
例如:Unicode序列 "A<NOT IDENTICAL TO><ALPHA>." (十进制: 0041,2262,0391,002E) 可以被编码如下:
A+ImIDkQ.
例如:Unicode序列 "Hi Mom -<WHITE SMILING FACE>-!" (十进制: 0048, 0069, 0020, 004D, 006F, 006D, 0020, 002D, 263A,002D, 0021) 可以被编码如下:
Hi Mom -+Jjo--!
例如:Unicode序列 用汉语表示日文 "nihongo" (十进制: 65E5,672C,8A9E) 可以被编码如下:
+ZeVnLIqe-
在MIME中使用UTF-7字符集
UTF-7字符集对邮件传输是安全的,因此可以应用于MIME中任何内容的编码(除非出现了对行长度和行中断的强制约束)。特定的,7-bit的编码用于主体, "Q内容编码"用于报头的情况也可以使用。MIME字符集的标签是UTF-7,这一点对大于等于2.0版本的Unicode很重要。
例子:这是一个MIME消息的片段,包含了一段Unicode序列:
"Hi Mom <WHITE SMILING FACE>!" (十进制 0048,0069, 0020, 004D, 006F, 006D, 0020, 263A, 0021)。Content-Type: text/plain; charset=UTF-7 Hi Mom +Jjo-!
例子:这是一个MIME消息的片段,包含了一段用汉语表示日语词 "nihongo" 的 Unicode 序列:
(十进制: 65E5, 672C, 8A9E)。Content-Type: text/plain; charset=UTF-7 +ZeVnLIqe-
例子: 这是一个MIME消息的片段 ,包含了一段Unicode序列:
"A<NOT IDENTICAL TO><ALPHA>." (十进制: 0041, 2262, 0391, 002E)Content-Type: text/plain; charset=utf-7 A+ImIDkQ.
例子: 这是一个MIME消息的片段,包含了一段Unicode序列:
"Item 3 is <POUND SIGN>1." (十进制 0049, 0074, 0065, 006D, 0020, 0033, 0020, 0069, 0073, 0020, 00A3, 0031, 002E)。Content-Type: text/plain; charset=UTF-7 Item 3 is +AKM-1.
注意:为了和"可能不支持Unicode与MIME的系统"达到最好的互用性,在准备邮件传输正文的时候,"行中断"应该遵守网络惯例。这意味着行应该很短而且要使用SMTP的CRLF来标记结束。Unicode的行分隔符(十进制 2028)和段分隔符 (十进制 2029)应该被替换为SMTP的行中断。理想的情况,这应该由一个理解 Unicode的用户代理透明的处理。
这样的准备也不是绝对必要的,因为UTF-7和适当的MIME编码可以在不遵守网络惯例的情况下处理正文,但是对于没有Unicode或者MIME的系统的可读性就会被削弱了。关于邮件协同工作能力问题的讨论可以参见 RFC 2045。
在UTF-7转换序列中行是不可以被打断的,因为这样的序列不可以跨越行中断。因此,UTF-7编码可以放在行中断后面。如果一行含有转换后会很长的序列,可以使用MIME中的编码来处理正文,比如 Quoted Printable。另一个可行性就是同时执行行中断和UTF-7编码,这样包含转换序列的行就已经符合长度限制了。
讨论
在本节中,我们将引入UTF-7编码,它反对选择现有的Unicode转换编码(例如UTF-8)和MIME编码一起使用。在讨论之前,有必要先列举一些假设,这些假设有关于典型自然语言文本串中字符出现的频率,而这些频率可以用来评估典型存储的需求:
注意:当前的8bit标准,比如ISO-8859-x,要求使用内容传输编码。为了和后续的讨论对比,把代价列举如下,(注意:很多其中的数字只是接近的,因为他们依赖文本确切的组成形式):
Base64中的8859-x 文本类型 平均字节数/字符 所有 1.33 Quoted Printable中的8859-x 文本类型 平均字节数/字符 US-ASCII 1 西欧 1.25 其他 2.67
注意:使用base64编码的Unicode平均一个字符占用了2.67个字节。为了对比,我们看一下UTF-8和UTF-7在Base64和Quoted中的情况。还要指出的是:一个较长的字符串有固定的经常性开销,大约为 1/n,n是指编码后字节串的长度。
UTF-8在 Base64中 文本类型 平均字节数/字符 US-ASCII 1.33 西欧 1.5 一些字母表的 2.44 其他 4 UTF-8在Quoted Printable中 文本类型 平均字节数/字符 US-ASCII 1 西欧 1.63 一些字母表的 5.17 其他 7-9 UTF-7 文本类型 平均字节数/字符 多数 US-ASCII 1 西欧 1.5 其他 2.67+2/n
我们会发现UTF-8在Quoted Printable选项中是不可行的,因为在文本中有太多的除了西欧语言外的其他的语言。当只有当文本中大多是ASCII或者拉丁数字字符,偶尔有其他的字符散布的时候,这样编码才是可行的。我们将首选介绍一种编码能很好的适用于所有用户。我们还会发现UTF-8与base64编码的使用者中,有大量的非西欧用户。即便是里面有很多的ASCII字符,因为没有很好的可读性,这样的编码也不是十分适用。基于UTF-7的编码可以给出很好的结果,并且对ASCII文本有很好的可读性。
UTF-7 给出的结果挑战了ISO-8859-x,而且适用于所有的Unicode字符。我想,这证明了引入一种新的Unicode转换编码是正确。
UTF-7作为一种可选的方案,但是,因为multipart/mixed内容类型忽略了行中断的问题,也可能在使用现有的MIME机制的时候会和其他的Unicode字符集产生混乱。(感谢Nathaniel Borenstein提了这个建议),例如:(重新说一下前面的例子)
Content-type: multipart/mixed; boundary=foo Content-Disposition: inline --foo Content-type: text/plain; charset=us-ascii Hi Mom --foo Content-type: text/plain; charset=UNICODE-2-0 Content-transfer-encoding: base64 Jjo= --foo Content-type: text/plain; charset=us-ascii ! --foo--
理论上,这里去掉了在消息体里对UTF-7的需求。(多部分类型不可以在报头字段里使用)事实上,我们发现使用Unicode字符集变得更为广泛了,间断使用一些特殊的Unicode字符(例如钱和数学符号)的情况会出现,并且文本里还会包含很多小块的其他的语句,比如西里尔的,希腊的和东亚的语言。(罗马的文字都已经能被MIME字符集充分处理了)虽然多部分技术对于大块用于交互的文本来说工作的很好,我们还是觉得它不能充分的支持刚刚讨论的应用类型,所以我们认为引入UTF-7是合理的。
总结
UTF-7编码方式使得Unicode字符集能在US-ASCII的7-bit范围中编码。对于一些Unicode序列,如果含有相对较长的US-ASCII字符串,中间夹杂了单个的Unicode字符或者Unicode串,这种编码是高效的。因为它容许没有Unicode支持的系统直接阅读US-ASCII的部分。UTF-7仅仅应该用在7-bit传输的时候,比如邮件。在其他的环境下,Unicode 或者UTF-8应该是首选的。
致谢
对如下人的贡献,评论和建议表示感谢,如果因为疏忽而遗漏了某一位,也不是故意的!
Glenn Adams Harald T. Alvestrand Nathaniel Borenstein Lee Collins Jim Conklin Dave Crocker Steve Dorner Dana S. Emery Ned Freed Kari E. Hurtta John H. Jenkins John C. Klensin Valdis Kletnieks Keith Moore Masataka Ohta Einar Stefferud Erik M. van der Poel
附录 A —— 例子:
这里有个更大的例子,是从一个BIG5编码的文档里拿来的。只是精简了一些。这里有两个版本,第一个使用了可选的"O"字符集(这可能会造成不能通过一些邮件网关),第二个没有。
Content-type: text/plain; charset=utf-7
下面就是全都是中文的一端节选 (+itaKng-)。原文是这样的:
"The sayings of Confucius," James R. Ware, trans. +U/BTFw-:+ZYeB9FH6ckh5Pg-, 1980. (中文文本做了英文转换)+Vttm+E6UfZM-, +W4tRQ066bOg-, +UxdOrA-: +Ti1XC2b4Xpc-, 1990."The Chinese Classics with a Translation, Critical and ExegeticalNotes, Prolegomena, and Copius Indexes," James Legge, trans., Taipei:Southern Materials Center Publishing, Inc., 1991.
(中文文本做了英文翻译)分别做了个BIG5和GB两个版本:
本文中没有包含BIG5或者GB的所有字符。缺失的字符已经使用它们的Unicode/ISO代码点指示出来了。"U+-" 后面跟着四个十六进制指定一个Unicode/10646代码(例如:U+-9F08)。这对小规模的BIG5和GB使用的问题,不是一个好的解决方案;但是这种解决方案的表现,对我个人而言是很满意的。
(缺失了…)+XrdxmVtXUXg-(缺失了…)John H. Jenkins +TpVPXGBG- jenkins@apple.com 5 January 1993(缺失了…)Content-type: text/plain; charset=utf-7
下面就是全都是中文的一端节选(+itaKng-)。原文是这样的:
+ACI-The sayings of Confucius,+ACI- James R. Ware, trans. +U/BTFw-:+ZYeB9FH6ckh5Pg-, 1980. (中文做了英文转换)+Vttm+E6UfZM-, +W4tRQ066bOg-, +UxdOrA-: +Ti1XC2b4Xpc-, 1990.+ACI-The Chinese Classics with a Translation, Critical and ExegeticalNotes, Prolegomena, and Copius Indexes,+ACI- James Legge, trans.,Taipei: Southern Materials Center Publishing, Inc., 1991.
(中文文本做了英文转换)分别做了个BIG5和GB两个版本:
本文中没有包含BIG5或者GB的所有字符。缺失的字符已经使用它们的Unicode/ISO代码点指示出来了。+ACI-U+-+ACI- 后面跟着四个十六进制指定一个Unicode/10646代码(例如:U+-9F08)。这对小规模的BIG5和GB(+ADs-)使用的问题,不是一个好的解决方案;但是这种解决方案的表现,对我个人而言是很满意的。
(缺失了…)+XrdxmVtXUXg-(缺失了…)John H. Jenkins +TpVPXGBG- jenkins+AEA-apple.com 5 January 1993(缺失了…)
对安全的考虑
本文没有讨论安全问题
自由广告区 |
分类导航 |
邮件新闻资讯: IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮 电子邮箱 | 反垃圾邮件|邮件客户端|网络安全 行业数据 | 邮件人物 | 网站公告 | 行业法规 网络技术: 邮件原理 | 网络协议 | 网络管理 | 传输介质 线路接入 | 路由接口 | 邮件存储 | 华为3Com CISCO技术 | 网络与服务器硬件 操作系统: Windows 9X | Linux&Uinx | Windows NT Windows Vista | FreeBSD | 其它操作系统 邮件服务器: 程序与开发 | Exchange | Qmail | Postfix Sendmail | MDaemon | Domino | Foxmail KerioMail | JavaMail | Winwebmail |James Merak&VisNetic | CMailServer | WinMail 金笛邮件系统 | 其它 | 反垃圾邮件: 综述| 客户端反垃圾邮件|服务器端反垃圾邮件 邮件客户端软件: Outlook | Foxmail | DreamMail| KooMail The bat | 雷鸟 | Eudora |Becky! |Pegasus IncrediMail |其它 电子邮箱: 个人邮箱 | 企业邮箱 |Gmail 移动电子邮件:服务器 | 客户端 | 技术前沿 邮件网络安全: 软件漏洞 | 安全知识 | 病毒公告 |防火墙 攻防技术 | 病毒查杀| ISA | 数字签名 邮件营销: Email营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |