天天看点

POP3遇到的编码问题

http://www.mxcz.net/tools/base64.aspx 在线解码器

从pop3返回的字符串中提取字符编码的字符串

提取出来后,转字符串显示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()打印的结果是不一致的

之前想用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去除,所以字符报错

一些解析需要关注的量

发信人:
  From: "=?gb18030?B?RGEu?=" <@qq.com>
  From: [email protected]

收信人:
  To: [email protected]
  To: "=?gb18030?B?ZGEzMDYxNTQ5ODI=?=" <[email protected]>

主题:
  Subject: =?gb18030?B?ru34tX9s6O1xNPKvP4=?=
  Subject: =?GBK?B?rbH4ObDtcS80s2l1/fStQ==?=
  Subject: =?gbk?B?S2r7vYuLQ6wLTX1FBQRMnMs8e1xLyku+Tyrz+?=

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

继续阅读