我们的应用程序从网络表单中获取文本,并通过电子邮件将其发送给适当的用户。然而,当有人从 Word 中复制/粘贴臭名昭著的“智能引号”或其他特殊字符时,事情就会变得棘手。
用户输入
he said “hello” to me—isn’t that nice?
但是当该邮件出现在 Outlook 2003 中时,结果如下:
he said hello to meisnt that nice?
代码是:
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);
这让我更接近,但没有雪茄:
he said “hello” to me—isn’t that nice?
我无法想象这是一个不常见的问题——我错过了什么?
最佳答案
包含表单的页面是否也使用 UTF-8 或不同的字符集?如果您不指定网页字符集,则任何人都可以猜测传入脚本的数据格式。
<小时/>编辑:消息中的字符集应如下设置:
msg.addHeader("Content-Type", "text/plain; charset=UTF-8");
因为字符集不是一个单独的 header ,而是 Content-type 的一个选项
关于java - MimeMessage 中的智能引号未在 Outlook 中正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/883532/