客户总是报告某些email 在outlook中可以正常显示,而在我用javamail编写的客户端却显示正文一片空白。看看日志报告的是 UnsupportedEncodingException 。我让客户把 email 原件从outlook 中下载下来发给我,打开一看,发现标题和正文使用的编码是 unicode-1-1-utf-7。
自从使用utf-8,很久没有遇到乱码的问题了。unicode-1-1-utf-7这个编码真是头一次看到。到google 上一搜,还真有不少人使用 javamail 遇到这个问题。不想这竟是 java 的 bug,参见 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4304013 。难以理解为什么 java 一直到1.4.2还不支持UTF-7编码(j2sdk1.5 不知道搞定没有)。
看看RFC 和一些网上资料,基本了解了UTF-7,摘录一段如下:
UTF-7:A Mail-Safe Transformation Format of Unicode(RFC1642)。这是一种使用 7 位 ASCII 码对 Unicode 码进行转换的编码。它的设计目的仍然是为了在只能传递 7 为编码的邮件网关中传递信息。 UTF-7 对英语字母、数字和常见符号直接显示,而对其他符号用修正的 Base64 编码。符号 + 和 - 号控制编码过程的开始和暂停。所以乱码中如果夹有英文单词,并且相伴有 + 号和 - 号,这就有可能是 UTF-7 编码。
客户自然不能接受程序平台bug这样的借口,所以重要的是如何搞定这个编码。google 又是一阵狂搜,老实说没有google,我不知道我是否仍然可以继续程序员这份很有前途的工作。但话有说回来,google也让我产生了惰性,遇到不明白的例外的时候基本就不再自己思考了。网上提问题的人多,解决问题的人少,好不容易发现有人提供了解决的办法,不曾想竟是个日本人。
我是仇日的,除了三年前一个 Olympus 的数码相机,我一直严于律己,不染日货。但我还是对这个叫做 木下信 的日本人心生敬意。他写了整整一本书来共享其使用 javamail 的经验,《JavaMail完全解说》。其中一篇专门介绍了如何处理 UTF-7编码并提供源码下载。参见:http://www.sk-jp.com/cgi-bin/treebbs.cgi?kako=1&all=1220&s=1220,涉及的source可以从 http://www.sk-jp.com/software 下载。
结合日本人的解法,我的部分处理代码如下:
private static String decodeStream(InputStream in, String charset) throws IOException { while ((c = in.read()) != -1) { try { } else { private static boolean isUTF7(String charset) { |
完全按照日本人的解法,时常会抛出sun.io.ConversionBufferFullException。问题可能出在它默认假定字符串一定包含有UTF7编码的内容,如果字符串只包含ASCII,那么就抛出了例外(UTF-7 对英语字母、数字和常见符号直接显示,而对其他符号用修正的 Base64 编码,见上UTF7的说明)。所以如果 catch 了例外,就直接用ISO8859-1编码处理。
希望java赶紧支持utf-7。我对unicode一直是一知半解,觉得编码这玩意挺复杂。主要是看到代码中遍布 >>、<< 这样的位操作符就心生怯意。到底不是科班出身啊。
自由广告区 |
分类导航 |
邮件新闻资讯: 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营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |