【发布时间】:2012-09-27 21:11:50
【问题描述】:
我正在尝试将所有 Windows 特殊字符转换为它们的 Unicode 等效字符。我们有一个 Flex 应用程序,用户在其中保存一些富文本,然后通过 Java 电子邮件程序将其通过电子邮件发送给他们的收件人。但是,我们不断遇到 Word 的特殊字符,这些字符仅在电子邮件中显示为 ?。
到目前为止我已经尝试过
private String replaceWordChars(String text_in) {
String s = text_in;
// smart single quotes and apostrophe
s = s.replaceAll("[\\u2018|\\u2019|\\u201A]", "\'");
// smart double quotes
s = s.replaceAll("[\\u201C|\\u201D|\\u201E]", "\"");
// ellipsis
s = s.replaceAll("\\u2026", "...");
// dashes
s = s.replaceAll("[\\u2013|\\u2014]", "-");
// circumflex
s = s.replaceAll("\\u02C6", "^");
// open angle bracket
s = s.replaceAll("\\u2039", "<");
// close angle bracket
s = s.replaceAll("\\u203A", ">");
// spaces
s = s.replaceAll("[\\u02DC|\\u00A0]", " ");
return s;
这可行,但我不想将所有 Windows-1252 字符手动编码为等效的 UTF-16(假设这是默认 Java 字符集)
但是,我们的用户不断从 Microsoft Word 中发现更多 Java 无法处理的字符。于是找了找,找到了这个例子
private String replaceWordChars(String text_in) {
String s = text_in;
try {
byte[] b = s.getBytes("Cp1252");
byte[] encoded = new String(b, "Cp1252").getBytes("UTF-16");
s = new String(encoded, "UTF-16");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
但是当我在 Eclipse 调试器中看到编码发生时,没有任何变化。
必须有一个简单的解决方案来处理微软可爱的 Java 编码。
有什么想法吗?
【问题讨论】:
-
在第一种情况下,您只是用 ASCII 字符替换非 ASCII 字符。你根本没有改变 encoding 。在第二段代码中,除了将 Cp1252 无法处理的所有字符转换为“?”之外,您实际上什么也没做。
-
好的 @JonSkeet 有没有想过用它们的 ASCII 等效字符替换所有非 ASCII 字符?
-
@CodingGuy 并非所有非 ascii 字符都有 ascii 等价物……ASCII 少于 128 个字符,而 Unicode 字符超过 100,000 个。您只需要弄清楚如何正确发送电子邮件。发送的电子邮件是什么编码?它应该是 UTF-8,然后您就不必删除非 ascii 字符了。
-
emailer 确实使用 UTF-8,当它不知道字符时,例如子弹,电子邮件只包含一个可爱的?。
-
那么电子邮件生成器或生成电子邮件文本的程序有其他问题,因为没有理由将特殊字符转换为 ?在 UTF-8 电子邮件中。
标签: java eclipse apache-flex