作者:[肖允锋]   <转载请指明出处>

  MIME(Multipurpose Internet Mail Extensions) 中没有将 Unicode 定义为一种许可的字符集,也没有规定其如何编码。虽然已有其他的一些编码格式(如:UTF-8)应用于邮件当中,但它们使用了128到255之间的数值去表示 Unicode 字符,这对于非 US-ASCII 的字符集的编解码是不利的。
  因为很多邮件网关和系统无法正确地提交八位的 US-ASCII 码,这样使用扩展的 US-ASCII 的字符将出现丢失位(bit)的情况。由于 UTF-7 只使用 7 位(bit),最高位不使用,因此 UTF-7 编码能够完整的在这些系统中进行传输。
  对于部分US-ASCII 字符和 US-ASCII 以外的字符,UTF-7 采用变字节顺序的方法进行解码,并使用 US-ASCII 中的保留字符作为转换字符(shift character)。以下是 UTF-7 编码和解码规则的说明。

  UTF-7 将 Unicode 字符分为三种进行处理:

  1. 直接进行编码的字符,即直接使用 US-ASCII 作为编码的字符。这类字符包括大小写字母、数字字符、以及下列字符。(注意不包含字符 + )
    '  (  )  ,  -  .  /  :  ? 。
  2. 可选择的直接进行编码的字符。(注意不包含字符 \ 和字符 ~) 
     ! " # $ % & * ; < = > @ [ ] ^ _ ' { | }
  3. 除1、2两种字符以外的 Unicode字符。

 

 UTF-7 的编码规则

 

  1. (direct encoding) 对于第一类字符,直接使用 US-ASCII 进行编码,对于第二类字符,则可选择的使用 US-ASCII 或变字节顺序的方法进行编码。但要注意,在邮件头中,若直接对第二类字符使用 US-ASCII 进行编码,可能会出现某些网关无法正确读取的现象。
  2. (Unicode shifted encoding) 除字符 "+" 和第一、二类两种字符以外字符需采用变字节顺序的方法进行解码,使用符号 "+" 控制编码过程的开始,直到遇到回车,换行字符或文末则结束,并使用 "-" 控制编码过程的结束。在 "+" 与 "-" 的编码采用修正的 Base64 编码表示。
    例如: 字符串"A≠Α"(Unicode: 0041 2260 0391)的编码为:A+ImADkQ-(ASCII: 41 2B 49 6D 41 44 6B 51 2D)
  3. 特殊字符 "+" 的编码为2B2D(H)。当出现着编码为2B2D(H),即"+-"的特殊情况时,直接则认定 2D(H) 无效,并予以忽略。因此2B2D(H)编码,解码得到的字符串为"+",而不是"+-"。对于编码2B2D2D(H),解码得到的字符串才是"+-"。
  4. 空格(dec 32), 跳格(dec 9), 回车(dec 13)和换行(dec 10),直接使用 US-ASCII 进行编码。

 修正的 Base64 编码的计算

 

  将字符的 Unicode big endian 编码分成两个字节看待,然后计算字符的 Base64 编码,但不使用 "=" 进行补位。

源程序(C语言)- Unicode.org 提供

Posted on 2006-02-26 22:54  RainVan  阅读(5259)  评论(4编辑  收藏  举报