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

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

java.io.UnsupportedEncodingException:BIG-5

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

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

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

您可以尝试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]