![]() |
![]() |
#1 (permalink) |
版主
注册日期: 2012-02-07
帖子: 281
|
![]()
为了适应有些传统系统会把8bits首位过滤掉的问题,
邮件协议里专门添加了base64和quoted-printable两种编码方式,把多字节字符转换成7bits字符, 具体的概念以及编码规则本文就不说了。 按照rfc的规范, “简单email测试”这几个字会被转成 =?gb2312?B?vPKlpWVtYWlssuLKlA==?= 抽象的说,是以 "=?" 开头 , "?="结束,中间 两个问号夹着编码规则, Q表示quoted-printable , B 表示 base64 。 如果按照Q或B规则重新解码,邮件原字就能正确显示。 但是有些软件会有一个不同于rfc要求的处理,即在使用base64编码时对一个字符串进行分段处理。比如上面的“简单email测试”, 就会分成三段 “简单” “email" "测试”。 按照这样处理的编码就成了出来的 =?gb2312?B?vPKlpQ==?=email=?gb2312?B?suLKlA==?= 大家应该都能看出来,区别在于处理时对于天然就是7bits的字符,不作任何编码转换,保持原貌,其他的分段编码。 这样处理的目的,我感觉程序员是为了空间上的考虑,毕竟base64对字符编码时会产生1/3的空间浪费(3个字符变成4个字符),而其中如果出现7bits字符的话,base64转换其实都是不必要的。 自然,很多有和我会有同样的考虑,由于 ?=gb2312?B?......?= 这样一个格式会产生额外的开销,所以当字符串里出现短促7bits字符时,这种处理反倒浪费空间。 空间上的开销是本文额外话题,因为现在的邮件支持8bits的字符,所以,大胆在邮件编写时使用中文字(多字节字)就可以了,不必管那些原始的、只支持7bits的系统。 不过这样的处理又需要注意一点,字符本身不会告诉我们它到底是采用 gb字符还是utf8字符,所以不同字符环境(locale)下邮件内容可能无法正常显示。 这点rfc编码里面到是作了聪明的处理, 在 ?= 和第二个问号之间要求标明字符集。 |
![]() |
![]() |