|
编码问题不是很熟,不知道以下文章对你是否能有所帮助?
CU 多媒体邮件编码的一点解析
参考:CU多媒体邮件终端功能规范 & [RFC]
对于发件人、回复(Reply-to)、地址栏字段中的呢称,或者是主题和附件文件名,如果采用如下的任一MIME编码类型进行了编码,在保存邮件之前,邮件服务客户端将应对这些字段进行解码。
字符集 MIME编码类型
us-ascii B type Q type
iso-8859-1 B type Q type
GB2312(GBK) B type Q type
HZ-Gb-2312 B type Q type
UTF-8 B type Q type
1.1.7.1.2 正文
邮件的正文部分支持如下的字符集:
US-ASCII
SO-8859-1
GB2312(GBK)
HZ-GB-2312
UTF-8
邮件正文的编码:
7-bit
8-bit
quoted-printable
Base64
附件的编码:
Base64
uuencode
quoted-printable
Binhex
uuencode是以前unix下常用编码方式应用于UUCP(unix to unix copy),通过串行通讯传输二进制文件.base64属于MIME(多用途国际互联网 邮件扩展)编码,与uuencode不是同一个范畴的,MIME主要应用于邮件,Uuencode主要应用在邮件和新闻组.
uuencode的开头是:
begin <模式> <文件名>
<数据>
end
编码算法为不断地用3个字节数据列成一组(不足3个字节以零补齐)然后 此24位数据分 为4组,每组6位,再将得到的6位二进制数映射到ASCII码32~95之间的字符,而每行以M 开头(表示32+45),60个字符一行(包括”M”),最后一行以32+N 的ASCII字符开头,N 为最后一行编码的输入字节数.编码以一个只含一个空格的一行和只含”end”的一行结束.
从前一部分看和base64没有什么区别(关于base64的编码和解码请参见http://www.csdn.net/develop/read_article.asp?id=8843),都是将3个字符换成4个字符,不同的是base64由自己的base64码表,而uuencode是直接使用ascii码做码表.
eg.
begin .....
M1&%T93H(“'@(“'@(#0O-2'\Y-2'Y.C,S.C$P($%-#0I&<FJM.B'@(“'@(“'@
M2&5N<GDL($@N62X@5VJN9PT*4W5B:F5C=#H@(“'@($%B;W5T($U)344@96YC
M;VIE=VIE8V1E8VJD92!P<FJG<F%M#0I4;SH @(“'@(“'@(“'@0VAA<FQE<R!-80T*
M;W(@8F%S938T(‘1R86YS9F5R(&9O<FUA=”P-“B' @(“'@(“'@(“'@(“UO(#QF
关于电子邮件中二进制数据的文本化编码工具uuencode
名称:uuencode
使用权限:所有使用者
使用方式:uuencode [-hv] [sourcefile] targetfile
说明:
早期在许多 unix 系统的传送协定只能传送七位元字元,并不支援二进位档案,像中文文字档就有用到八位元,所以无法完整地送到另一架机器上。 uuencode 指令,可以将二进位档转换成七位元的档案,传送到另一架机器上再以 uudecode 还原。最常见的是用在以电子邮件传送二进位档。uuencode 编码后的资料都以 begin 开始,以 end 作为结束。
begin *** decode.dat
(内容编码)
end
begin 后的 *** 是 unix 档案的调用权限代码。而 decode.dat 则是还原后的档名。
参数:
h 列出指令使用格式 (help)
v 列出版本讯息 (version)
范例:
将 source.dat 编码后存成 file.uud 档。由于 uuencode 会将编码后的资料在荧幕上列出,所以必须将资料导入 file.uud 中,而 target.dat 是 file.uud 还原后的档案名字,而不是编码后的档案。
uuencode source.dat target.dat > file.uud
执行指令后,由标准输入装置读入资料,简单地说是由键盘输入后在荧幕显示的资料,按 Crtl + d 键后就会被编码,输出至 file.uud 中。由于程序是以行为处理单位,若无法跳出程序,请多按几次 Ctrl + d 直到程序结束为止。
uuencode target.dat > file.uud
类似上一个指令,不过使用一个导入的技巧,将 source.dat 压缩后的资料传送给 uuencode 处理之后,存成 file.uud 档。 file.uud 档还原后就是source.dat.Z 档。
compress -c source.dat | uuencode source.dat.Z > file.uud
显示版本讯息后,结束执行程序。
uuencode -v
Base64编码:
Base64算法是把3个8位字符(24)转换成4个6位字符(32),因此编码后的长度会扩大1/3,进行编码转换时需要用到一张Base64的编码表:
Table 1: The Base64 Alphabet
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 5***
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
在VB中可以简单的将其保存为一个常量:
Private Const Base64Table =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
编码过程是这样的,第一个字符通过右移2位获得第一个目标字符的Base64表位置,根据这个数值取到表上相应的字符,就是第一个目标字符,然后将第一个字符左移6位加上第二个字符右移4位,即获得第二个目标字符,再将第二个字符左移4位加上第三个字符右移6位,获得第三个目标字符,最后取第三个字符的右6位即获得第四个目标字符.
例如我们取一个简单的字符串"TEST..."
将其用SourceByte = StrConv(SourceText, vbFromUnicode)转换后获得二进制数组:
T E S T ...
84 69 83 84 ...
01010100 01000101 01010011 01010100 ...
01010100/01000101/01010011/01010100
01010100010001010101001101010100
转换后:
01010100010001010101001101010100
010101/000100/010101/010011/010101/00
010101 000100 010101 010011 010101 00....
21 4 21 19 21 ...
V E V T V ...
最后得到的就是"VEVTV..."
对于第一个目标字符我们可以这样做:
(SourceByte(1) and 252)/4
第二个:
(SourceByte(1) and 3)*64 + (SourceByte(2) and 240)/16
第三个:
(SourceByte(2) and 15)*16 + (SourceByte(3) and 48)/64
第四个:
(SourceByte(3) and 63)
Base64解码过程正好相反,另外有关MIME的RFC还是有很多的,如果需要详细情况请自己查找,上面那张表就摘自
<RFC1521#
MIME (Multipurpose Internet Mail Extensions)
Part One: Mechanisms for Specifying and Describing the Format of Internet
Message Bodies> |
|