http://www.mxcz.net/tools/base64.aspx 在线解码器
从pop3返回的字符串中提取字符编码的字符串
String charset = head.substring(head.indexOf("charset=") + 8, head.indexOf("Content-Transfer-Encoding"));
提取出来后,转字符串显示charset就开始抛字符编码出错的异常
public static String getFromBASE64(String s, String charset) {
if (s == null)
return null;
if (charset == null)
charset = "utf-8";
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(s);
//下面这charset如果传入pop3解析出来的字符编码就报错
return new String(b, charset);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
之后做了个测试,解析出来的与直接写的获取getBytes()打印的结果是不一致的
System.out.println(charset.getBytes() + "----" + "utf-8".getBytes());
之前想用switch case来解决这个问题但是还是不行,最后只能这样
//获得字符集,不知道为什么邮件里面获取的字符串字符集有问题
public static String chooseCharset(String charset) {
if (charset.contains("utf-8")) {
return "utf-8";
}
if (charset.contains("gbk")) {
return "gbk";
}
if (charset.contains("gb18030")) {
return "gb18030";
}
return null;
}
问题:从pop3返回内容中虽然能提取到字符编码的字符串比如utf-8,gbk,但是new String(b, charset);这会抛不认识这个字符编码的异常,但是手动传new String(b, “utf-8”);又没事。
最好的解决方案:把POP3提取出来的charset要先转码(目前不知道到要怎么实现这个)
问题解决:在这解析的时候多了一个\n所以需要-1去除,所以字符报错
String charset = head.substring(head.indexOf("charset=") + 8, head.indexOf("Content-Transfer-Encoding") - 1);
一些解析需要关注的量
发信人:
1.From: "=?gb18030?B?RGEu?=" <306154982@qq.com>
2.From: da306154982@163.com
收信人:
1.To: da306154982@163.com
2.To: "=?gb18030?B?ZGEzMDYxNTQ5ODI=?=" <da306154982@163.com>
主题:
1.Subject: =?gb18030?B?0ru34tX9s6O1xNPKvP4=?=
2.Subject: =?GBK?B?0rbH4ObDtcS80s2l1/fStQ==?=
3.Subject: =?gbk?B?19S2r7vYuLQ6wLTX1FBQRMnMs8e1xLyku+7Tyrz+?=
Content-Type: text/html; 内容的格式
charset="gb18030" 内容的字符编码
Content-Transfer-Encoding: base64 内容的传输加密方式
如果是附件的话 filename附件名称:
Content-Disposition: attachment; filename="test.png"
需要注意的是中文名字的附件:
Content-Disposition: attachment; filename="=?gb18030?B?08q8/re1u9gudHh0?="