POP3遇到的编码问题

来源:互联网 发布:数据库设计原则,范式 编辑:程序博客网 时间:2024/05/20 07:51

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?="