这个仍然是和读邮件相关的。
规则大致是:除了换行符,其它任何8位长度的字节必须被表示成一个"="号加上高四位的十六进制数和低四位的十六进制数,十六进制数是用"0123456789ABCDEF"的ASCII字符码表示,其中"ABCDEF"都必须是大写;当8位长度的字节值在33至60(包括33和60),62至126(包括62和126)之间时,直接用该数据对应的ASCII码来表示。
直接代码
1 public static function encode(data:String, charset:String = "gb2312"):String 2 { 3 var bytes:ByteArray = new ByteArray(); 4 bytes.writeMultiByte(data, charset); 5 return encodeByteArray(bytes); 6 } 7 8 public static function encodeByteArray(data:ByteArray):String 9 { 10 if(data == null || data.length == 0) 11 return ""; 12 data.position = 0; 13 var len:int = data.length; 14 var output:String = ""; 15 var inlineLen:int = 0;//每行长度 16 for(var i:int = 0; i<len; i++) 17 { 18 var code:uint = data[i]; 19 if(code >= 33 && code <= 126 && code != "=".charCodeAt(0))// 介于 33 到 126 之间, 且c_copy[i]的值不为'='的时候, 直接输出 20 { 21 output += String.fromCharCode(data[i]); 22 inlineLen++; 23 } 24 else// 其它的需编码为'='加两个字节的HEX码(大写) 25 { 26 output += "="; 27 output += charToHex(data[i]); 28 inlineLen += 3; 29 } 30 // 保证输出行不超过规定长度, 可在行尾加"=/r/n"序列作为软回车 31 // if(inlineLen >= 73) 32 // { 33 // output += "=\r\n"; 34 // inlineLen = 0; 35 // } 36 } 37 return output; 38 }
在查到的规则里面说要加=/r/n来换行,不知道为什么要加,所以直接去掉。
解码的时候也不对这个处理。
预览:
代码下载