有没有办法为Java的Charset名称添加别名

时间:2016-11-29 22:02:50

标签: java character-encoding java-8 javamail

我得到了一个异常,埋没在第三方库中,并带有如下消息:

  

java.io.UnsupportedEncodingException:BIG-5

我认为这种情况正在发生,因为Java没有为Charset.forName("big5")定义此名称。 Charset.forName("big-5")很好,但Charset.forName("utf8"会抛出异常。 (所有这些名称似乎都不区分大小写。)

这与“utf-8”不同,后者有一些别名更宽容。例如,Charset.forName("utf-8"))和//HTTPS redirect middleware function ensureSecure(req, res, next) { console.log(req.protocol + process.env.PORT + '' + req.hostname + req.url); if(req.secure || req.hostname=='localhost'){ //Secure request, continue to next middleware next(); }else{ res.redirect('https://' + req.hostname + req.url); console.log(req.protocol + process.env.PORT + '' + req.hostname + req.url); } } //Parse the body of the request as a JSON object, part of the middleware stack (https://www.npmjs.com/package/body-parser#bodyparserjsonoptions) app.use(bodyParser.json()); //Serve static Angular JS assets from distribution, part of the middleware stack, but only through HTTPS app.all('*', ensureSecure); app.use('/', express.static('dist')); //Import routes app.use('/api', [router_getToken, router_invokeBhApi]); //Setup port for access app.listen(process.env.PORT || 3000, function () { console.log(`The server is running on port ${process.env.PORT || 3000}!`); }); 都可以正常工作。

问题:有没有办法添加别名,以便“big-5”映射到“big5”?

1 个答案:

答案 0 :(得分:3)

您可以尝试mail.mime.contenttypehandler系统属性:

  

在某些情况下,JavaMail无法处理带有无效Content-Type标头的邮件。标头可能具有不正确的语法或其他问题。此属性指定在JavaMail使用它之前将用于清理Content-Type标头值的类的名称。该类必须具有带有此签名的方法:public static String cleanContentType(MimePart mp,String contentType)每当JavaMail访问消息的Content-Type标头时,它都会将值传递给此方法并使用返回的值。

这方面的一个例子是:

import java.util.Arrays;
import javax.mail.Session;
import javax.mail.internet.ContentType;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimePart;

public class FixEncodingName {

    public static void main(String[] args) throws Exception {
        MimeMessage msg = new MimeMessage((Session) null);
        msg.setText("test", "big-5");
        msg.saveChanges();
        System.out.println(msg.getContentType());
        System.out.println(Arrays.toString(msg.getHeader("Content-Type")));
    }

    public static String cleanContentType(MimePart p, String mimeType) {
        if (mimeType != null) {
            String newContentType = mimeType;
            try {
                ContentType ct = new ContentType(mimeType);
                String cs = ct.getParameter("charset");
                if ("big-5".equalsIgnoreCase(cs)) {
                    ct.setParameter("charset", "big5");
                    newContentType = ct.toString();
                }
            } catch (Exception ignore) {
                newContentType = newContentType.replace("big-5", "big5");
            }

            /*try { //Fix the header in the message.
                p.setContent(p.getContent(), newContentType);
                if (p instanceof Message) {
                    ((Message) p).saveChanges();
                }
            } catch (Exception ignore) {
            }*/
            return newContentType;
        }
        return mimeType;
    }
}

使用-Dmail.mime.contenttypehandler=FixEncodingName运行时会输出:

text/plain; charset=big5
[text/plain; charset=big-5]