Rob*_*b N 6 java jakarta-mail character-encoding java-8
我得到一个异常,埋没在第三方库中,有这样的消息:
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系统属性:
在某些情况下,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;
}
}
Run Code Online (Sandbox Code Playgroud)
运行时-Dmail.mime.contenttypehandler=FixEncodingName
将输出:
text/plain; charset=big5
[text/plain; charset=big-5]
Run Code Online (Sandbox Code Playgroud)