用javamail取附件(中文)名,为什么总是得到"=?ISO-8859-1?BD=EC=.....zip" 这样的字符串,不能得到正确的中文名?(在线等) 这个可能是Quote-Printable编码,你再查查资料吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Quote-Printable其原理是把一个 8 bit 的字符用两个16进制数值表示,然后在前面加“=”。所以我们看到经过QP编码后的文件通常是这个样子:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1 怎样将Quote-Printable编码的字符串转化成汉字呢? public static final String QP_DeCode(String str) { int len = str.length(); int i = 0; char c0 = '0'; char c1 = '0'; char c2 = '0'; StringBuffer strbuf = new StringBuffer(); while(i<len) { c0 = str.charAt(i++); if(c0=='=') { c1 = str.charAt(i++); c2 = str.charAt(i++); if(c1 >= '0' && c1 <= '9') c1 = (char)(c1 - '0'); else if (c1 >= 'A' && c1 <= 'F') c1 = (char)(c1 - ('A' - 10)); else if (c1 >= 'a' && c1 <= 'f') c1 = (char)(c1 - ('a' - 10)); if(c2 >= '0' && c2 <= '9') c2 = (char)(c2 - '0'); else if (c2 >= 'A' && c2 <= 'F') c2 = (char)(c2 - ('A' - 10)); else if (c2 >= 'a' && c2 <= 'f') c2 = (char)(c2 - ('a' - 10)); c0 = (char)(c1<<4 | c2); strbuf.append(c0); }else { strbuf.append(c0); } } return new String(strbuf); } 我遇到的问题和你的类似你试试这个方法,把附件名用MimeUtility.decodeText(String attachmentFileName)解码String str = MimeUtility.decodeText(attachmentFileName);得到的str应该就对了 javamail中没有专门用于解码Quote-Printable 的函数吗? 很多朋友都使用过JavaMail进行邮件发送,在邮件正文中的乱码容易解决。但邮件主题的乱码无论怎样转码总是显示一堆乱码。到底应该怎么处理呢? JavaMail中的邮件主题需要进行BASE64编码,格式形如: =?GB2312?B?xPq1xMPcwuvS0b6t1tjWw6Osx+u+ob/stcfCvKOssqLQ3rjEw9zC66Oh?= 所以,直接使用msg.setSubject("中文主题"),或者msg.setSubject("中文主题".getBytes("8859_1"), "GB2312"))都一样会出现乱码。在设置邮件主题前需要将主题字串的字节编码为BASE64格式,并添加编码头,示例代码如下: sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?="); 怎么样,现在中文可以正常显示了吧。给分吧!!! MimeUtility.decodeText(String attachmentFileName)好像只能解码把base64编码的字符串,qp编码的不起作用,有些qp字符串没有转换,有些qp字符串又变成了"??????",怎么会事? 我是考滤有此用户直接用imail的WEB方式发送邮件,这样所发邮件的符件名就是用qp编码的,用javamail收邮件时,就要将qp编码的字符串转化过来,现寻转换QP字符串的方式? 偶上面的方法转QP编码有问题吗?偶在J2ME里测试没问题呀,也可能偶测试的mail比较简单吧建议你看看smtp和pop3的规范你把"=?ISO-8859-1?BD=EC=.....zip" 换成"=BD=EC=.....zip"试试偶上面的转换方法 funpig(麻子) 你的方法没问题,我是想看有没有更简洁点的方式(人懒了没办法),刚才细仔看了下java api,找到一个办法:string sl="";String filename=part.getfilename(); //得到文件名StringBufferInputStream sbi=new StringBufferInputStream(filename); //转换stringInputStream is=MimeUtility.decode(sbi,"quoted-printable"); //解码byte buff[]=new byte[80];int a=is.read(buff); //从inputstream中读出内容sl=new String(buff); //得到string 哈哈,不错!偶的那个是用在J2ME里的,谁叫J2ME要自己写呢。 讨厌的编码,标题即有base64,又有Quote-Printable,还有的干脆就不编码的,这还好,处理处理就算了,最可气的是什么发件人,发件人也是这样,处理起来太麻烦了,不知道各位有什么好的处理办法??? 我现在有个问题,象下面这段:=?ISO-8859-1?Q?Fw: Fw: =B3=AC=BC=89=CC=A9=87=F8=8E=9B=B8=E7~ ?=中有两个Fw:,这怎么办呢? 我像实现下列效果,麻烦给点建议或意见 在jsp里怎么取IP地址?? 请教:tomcat连接池问题,运行一段时间后连不上sqlserver java在Action中操作数据库中的数据合并(在线等。。跪求大神。。。) 按时间查找 请教大家一个关于cookie的问题 关于struts2验证的问题 如何让相同的用户名不能重复登陆。 JSP的中文问题!急... 大家帮忙!! 100分悬赏:很急 一个用jsp写的网站在本机上如何调试? 请高手指点,struts的思路?
{
int len = str.length();
int i = 0;
char c0 = '0';
char c1 = '0';
char c2 = '0';
StringBuffer strbuf = new StringBuffer();
while(i<len)
{
c0 = str.charAt(i++);
if(c0=='=')
{
c1 = str.charAt(i++);
c2 = str.charAt(i++);
if(c1 >= '0' && c1 <= '9')
c1 = (char)(c1 - '0');
else if (c1 >= 'A' && c1 <= 'F')
c1 = (char)(c1 - ('A' - 10));
else if (c1 >= 'a' && c1 <= 'f')
c1 = (char)(c1 - ('a' - 10)); if(c2 >= '0' && c2 <= '9')
c2 = (char)(c2 - '0');
else if (c2 >= 'A' && c2 <= 'F')
c2 = (char)(c2 - ('A' - 10));
else if (c2 >= 'a' && c2 <= 'f')
c2 = (char)(c2 - ('a' - 10));
c0 = (char)(c1<<4 | c2);
strbuf.append(c0);
}else
{
strbuf.append(c0);
}
}
return new String(strbuf);
}
你试试这个方法,把附件名用MimeUtility.decodeText(String attachmentFileName)解码
String str = MimeUtility.decodeText(attachmentFileName);
得到的str应该就对了
JavaMail中的邮件主题需要进行BASE64编码,格式形如:
=?GB2312?B?xPq1xMPcwuvS0b6t1tjWw6Osx+u+ob/stcfCvKOssqLQ3rjEw9zC66Oh?=
所以,直接使用msg.setSubject("中文主题"),或者msg.setSubject("中文主题".getBytes("8859_1"), "GB2312"))都一样会出现乱码。在设置邮件主题前需要将主题字串的字节编码为BASE64格式,并添加编码头,示例代码如下:
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");
怎么样,现在中文可以正常显示了吧。给分吧!!!
建议你看看smtp和pop3的规范你把"=?ISO-8859-1?BD=EC=.....zip" 换成"=BD=EC=.....zip"试试偶上面的转换方法
=?ISO-8859-1?Q?Fw: Fw: =B3=AC=BC=89=CC=A9=87=F8=8E=9B=B8=E7~ ?=
中有两个Fw:,这怎么办呢?