我们的应用程序从Web表单中获取文本,并通过电子邮件将其发送给相应的用户。然而,当有人在臭名昭着的“智能引号”或Word中的其他特殊字符中复制/粘贴时,事情会变得毛茸茸。
用户输入
他对我说“你好” - 那不是很好吗?
但是当Outlook 2003中出现消息时,它会出现如下:
他向你问好,好吗?
这个代码是:
Session session = Session.getInstance(props, new MailAuthenticator());
Message msg = new MimeMessage(session);
//removed setting to/from addresses to simplify
msg.setSubject(subject);
msg.setText(text);
msg.setHeader("X-Mailer", MailSender.class.getName());
msg.setSentDate(new Date());
Transport.send(msg);
经过一番研究,我认为这可能是一个字符编码问题,并试图将事情转移到UTF-8。所以,我这样更新了代码:
Session session = Session.getInstance(props, new MailAuthenticator());
MimeMessage msg = new MimeMessage(session);
//removed setting to/from addresses to simplify
msg.setHeader("X-Mailer", MailSender.class.getName());
msg.addHeader("Content-Type", "text/plain");
msg.addHeader("charset", "UTF-8");
msg.setSentDate(new Date());
Transport.send(msg);
这让我更接近,但没有雪茄:
他对我说“你好” - 不是很好吗?
我无法想象这是一个不寻常的问题 - 我错过了什么?
答案 0 :(得分:1)
您的表单页面是否也使用UTF-8或其他字符集?如果您没有指定网页字符集,那么进入您脚本的数据格式是任何人都可以猜到的。
编辑:邮件中的字符集应设置如下:
msg.addHeader("Content-Type", "text/plain; charset=UTF-8");
因为charset不是单独的标题,而是Content-type
的选项答案 1 :(得分:0)
为什么不用常规素数引号替换好的引号?
答案 2 :(得分:0)
我会检查从浏览器接收的数据是否正确 - 转储Unicode代码点并根据charts检查它们:
public static void printCodepoints(char[] s) {
for (int i = 0; i < s.length; i++) {
int codePoint = Character.isHighSurrogate(s[i]) ? Character
.toCodePoint(s[i], s[++i])
: s[i];
System.out.println(Integer.toHexString(codePoint));
}
}
例如,符号DOUBLE LEFT QUOTATION MARK(“)是字符U + 201C。
自从我使用邮件API以来已经很长时间了,但是MimeMessage.html.setText(text, charset)方法可能值得一看。 setText(String)上的文档说它使用默认字符集(如果你使用英文/ Latin-1 Windows,可能是windows-1252)。
答案 3 :(得分:0)