【问题标题】:Smart quotes in a MimeMessage not showing up correctly in OutlookMimeMessage 中的智能引号未在 Outlook 中正确显示
【发布时间】:2010-10-27 09:07:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • charset 是一个 Content-Type 选项,而不是单独的标题。否则,它看起来不错。

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


【解决方案1】:

您的表单页面是否也使用 UTF-8 或不同的字符集?如果您不指定网页字符集,那么您的脚本中的数据格式是任何人的猜测。


编辑:消息中的字符集应该这样设置:

msg.addHeader("Content-Type", "text/plain; charset=UTF-8");

因为 charset 不是单独的标头,而是 Content-type 的一个选项

【讨论】:

  • 尝试设置页面字符集。 (到 UTF-8)。我认为转换粘贴的字符取决于资源管理器。 “测试”
【解决方案2】:

为什么不将漂亮的引号替换为常规的素引号?

【讨论】:

  • 这当然是一个选项,但如果我可以避免创建一个“用 替换 ”规则的映射,我愿意。
【解决方案3】:

我会检查从浏览器接收到的数据是否正确 - 转储 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));
    }
  }

例如,符号左双引号 () 是字符 U+201C。

我已经很久没有使用邮件 API 了,但是 MimeMessage.html.setText(text, charset) 方法可能值得一看。 setText(String) 上的文档说它使用默认字符集(如果您使用的是英语/拉丁语 1 Windows,可能是 windows-1252)。

【讨论】:

    【解决方案4】:

    IIRC、MS Office 引号被发现字符集“iso-8859-1”。

    【讨论】:

    • 不,他们不是。它们位于许多 MS Office 代码页中,其中一些是相当接近的相应 ISO 拉丁字符集的“包含和扩展”版本。
    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2013-10-22
    • 2016-11-05
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多