MimeMessage中的智能引号未在Outlook中正确显示

时间:2009-05-19 15:41:29

标签: java email character-encoding outlook mime-message

我们的应用程序从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);

这让我更接近,但没有雪茄:

  他对我说“你好” - 不是很好吗?

我无法想象这是一个不寻常的问题 - 我错过了什么?

4 个答案:

答案 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)

IIRC,MS Office报价发现字符集“iso-8859-1”。