1

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

4 回答 4

1

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


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

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

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

于 2009-05-19T16:01:25.100 回答
0

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

于 2009-05-19T15:49:30.280 回答
0

我会检查从浏览器接收到的数据是否正确 - 转储 Unicode 代码点并对照图表检查它们:

  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)。

于 2009-05-19T16:41:41.063 回答
0

IIRC,MS Office 引号是字符集“iso-8859-1”。

于 2009-05-24T15:25:03.153 回答