加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 01:06:56 所属栏目:Java 来源:网络整理
导读:我得到一个异常,埋没在第三方库中,有这样的消息: java.io.UnsupportedEncodingException: BIG-5 我认为这是因为Java没有为java.nio.charset.Charset定义这个名称. Charset.forName(“big5”)很好,但Charset.forName(“big-5”)抛出异常. (所有这些名称似乎

我得到一个异常,埋没在第三方库中,有这样的消息:

java.io.UnsupportedEncodingException: BIG-5

我认为这是因为Java没有为java.nio.charset.Charset定义这个名称. Charset.forName(“big5”)很好,但Charset.forName(“big-5”)抛出异常. (所有这些名称似乎都不区分大小写.)

这与“utf-8”不同,后者有一些别名更宽容.例如,Charset.forName(“utf8”)和Charset.forName(“utf-8”)都可以正常工作.

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

最佳答案
您可以尝试mail.mime.contenttypehandler系统属性:

In some cases JavaMail is unable to process messages with an invalid Content-Type header. The header may have incorrect syntax or other problems. This property specifies the name of a class that will be used to clean up the Content-Type header value before JavaMail uses it. The class must have a method with this signature: public static String cleanContentType(MimePart mp,String contentType) Whenever JavaMail accesses the Content-Type header of a message,it will pass the value to this method and use the returned value instead.

一个例子是:

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]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读