|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
为什么外国人还要写那些框架进行代码封装,他们不就是为了别人使用时可以更简单么!如果要达到一个企业级项目的不用框架是很难的。小一些的项目还行,大的光是MVC模式的设计的编码量就够大的了。还有性能方面,单轮windows,这个工具是微软写的,。我一向想欠亨,RFC822尺度都公布几年了,为何另有那末多不切合标准的email呈现呢?一来大概是服务器的成绩,二来就是不卖力任的程序员的错了。以是我俄然意想到,不是只要冷血无情的老板和不可一世的客户让程序员的身心饱受培植,偕行的不经意或经意也在加重着危险。
我面临着一份邮件原文收回以上的感伤,客户埋怨该邮件收到的时分在体系中注释显现是乱码。这是一份典范的分歧标准的邮件:Content-Type:text/plain,没有申明charset,而接上去的注释间接就是未举行任何编码的中文笔墨。不外Subject倒是切合标准的(=?gb2312?B?xxxxxxx?=)。
行行色色的分歧标准的邮件见过很多,最多见的就是某些header未编码,另有的大概就是,Body编码了而Subject未编码,最厌恶的就是整份Email都没有编码信息。
恨回恨,成绩仍是得办理,我修正了代码,处置逻辑以下:
1.在最入手下手剖析邮件的时分,先剖析某些大概带有编码信息的header,并纪录为headerCharset;部分代码以下:
privatestaticPatternencodeStringPattern=Pattern.compile("=?(.+)?(B|Q)?(.+)?=",Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
privatefinalString[]CHARTSET_HEADER=newString[]{"Subject","From","To","Cc","Delivered-To"};
..........
Enumerationenum=message.getMatchingHeaderLines(CHARTSET_HEADER);
while(enum.hasMoreElements()){
Stringheader=(String)enum.nextElement();
Matcherm=encodeStringPattern.matcher(header);
if(m.find()){
this.headCharset=m.group(1);
log.debug("guessmailcharsetis"+this.headCharset);
break;
}
}
2.接着剖析邮件体,找到Body的时分,看看是不是指明charset信息;假如指定了,纪录为bodyCharset;假如没有,利用headerCharset,假如headerCharset也是null,利用默许charset。一般是ISO-8859-1。
3.最初再处置邮件header,假如没有charset信息,利用bodyCharset,不然利用默许charset。
以上的办理计划,只需邮件的Body大概Header中的一个供应了编码信息,那末都大概能够制止乱码的发生,假如哪份遭千杀的邮件,Body用gb2312编码,Subject倒是未编码的日文,那我只能长叹被击败了。假如整份邮件都没有编码信息的话,除非你断定邮件都是指定的编码并举行转码,不然只要任天由命。
最初仍是要号令一声,请遵守标准!
还得说上一点,就java本质而言,是面相对象的,但是你有没有发现,java也不全是,比如说基本类型,int,那他就是整型而不是对象,转换类型是还得借助包装类。 |
|