java - StringEscapeUtils 不处理 utf-8

标签 java arrays unicode utf-8 apache-commons

我有一个这样的字符串

String incoming = "<html> <head></head> <body>  <p><span style=\"font-family: Arial;\">Ευχαριστώ (eff-kha-ri-STOE) Tι κανείς (tee-KAH-nis)? Mε συγχωρείτε.</span></p> </body></html>";

我使用 StringEscapeUtils 转义它

import org.apache.commons.text.StringEscapeUtils;
String escaped = StringEscapeUtils.escapeJava(incoming);

结果是

<html> <head></head> <body>  <p><span style=\"font-family: Arial;\">\u0395\u03C5\u03C7\u03B1\u03C1\u03B9\u03C3\u03C4\u03CE (eff-kha-ri-STOE) T\u03B9 \u03BA\u03B1\u03BD\u03B5\u03AF\u03C2 (tee-KAH-nis)? M\u03B5 \u03C3\u03C5\u03B3\u03C7\u03C9\u03C1\u03B5\u03AF\u03C4\u03B5.</span></p> </body></html>

我尝试通过获取字节将其转换为 utf-8,但它不起作用,有什么办法可以修复它吗?

这是我尝试过的:

String s = new String(escaped.getBytes("UTF-8"), "UTF-8");

我还尝试了不同的库来转义文本仍然不起作用。

最佳答案

我假设您希望对输入String 中的单引号、双引号和反斜杠等字符进行转义,但希望希腊字符保持不变。

不幸的是,StringEscapeUtils.escapeJava() 会将 Unicode 值 > 0x7f 的任何文本字符转换为其 Unicode Escape 等效项。例如,您的示例数据显示希腊字母 tau (τ) 在 StringEscapeUtils.escapeJava() 返回的字符串中转义为 \u03C4 >。我不知道为什么 escapeJava() 这样做。 Its Javadoc指出“使用 Java 字符串规则转义字符串中的字符。”,但我找不到“Java 字符串规则”的正式定义。

删除 StringEscapeUtils.escapeJava() 返回的字符串中的 Unicode 转义的简单方法是调用 the UnicodeUnescaper() classtranslate() 方法。 :

Translates escaped Unicode values of the form \u+\d\d\d\d back to Unicode. It supports multiple 'u' characters and will work with or without the +.

因此调用 UnicodeUnescaper.translate() 将返回一个 String:

  • 保留字符串中的转义字符(例如双引号)不变。
  • 将 Unicode 文字替换为对应的希腊字符。例如,\u03C4 将更改为 τ

代码很简单。使用您的数据:

import org.apache.commons.text.StringEscapeUtils;
import org.apache.commons.text.translate.UnicodeUnescaper;

void convert() {
    String incoming = "<html> <head></head> <body>  <p><span style=\"font-family: Arial;\">Ευχαριστώ (eff-kha-ri-STOE) Tι κανείς (tee-KAH-nis)? Mε συγχωρείτε.</span></p> </body></html>";
    String escaped = StringEscapeUtils.escapeJava(incoming); 
    String greekChars = new UnicodeUnescaper().translate(escaped);

    System.out.println("incoming:   " + incoming); 
    System.out.println("escaped:    " + escaped);    // Quotes are escaped, and Greek characters are converted to Unicode escapes.
    System.out.println("greekChars: " + greekChars); // Quotes remain escaped, but Unicode escapes are converted back to Greek characters.
}

这是 println() 调用的输出:

run:
incoming:   <html> <head></head> <body>  <p><span style="font-family: Arial;">Ευχαριστώ (eff-kha-ri-STOE) Tι κανείς (tee-KAH-nis)? Mε συγχωρείτε.</span></p> </body></html>
escaped:    <html> <head></head> <body>  <p><span style=\"font-family: Arial;\">\u0395\u03C5\u03C7\u03B1\u03C1\u03B9\u03C3\u03C4\u03CE (eff-kha-ri-STOE) T\u03B9 \u03BA\u03B1\u03BD\u03B5\u03AF\u03C2 (tee-KAH-nis)? M\u03B5 \u03C3\u03C5\u03B3\u03C7\u03C9\u03C1\u03B5\u03AF\u03C4\u03B5.</span></p> </body></html>
greekChars: <html> <head></head> <body>  <p><span style=\"font-family: Arial;\">Ευχαριστώ (eff-kha-ri-STOE) Tι κανείς (tee-KAH-nis)? Mε συγχωρείτε.</span></p> </body></html>
BUILD SUCCESSFUL (total time: 0 seconds)

注释:

  • 请务必使用 UnicodeUnescaperorg.apache.commons.text.translate。旧的已弃用版本存在于 org.apache.commons.lang3.text.translate 中。 This is a link访问 Apache Commons Text 的下载页面,目前版本为 1.8。
  • 这不是一个理想的解决方案,因为它调用 UnicodeUnescaper.translate() 来修复 StringEscapeUtils.escapeJava() 造成的困惑。可能还有其他更干净的方法(通过使用 StringEscapeUtils.escapeJava() 的替代方法),但这种方法似乎适合您的数据。

关于java - StringEscapeUtils 不处理 utf-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59280607/

相关文章:

java - SharedPreferences 上的 NullPointerException (似乎是上下文)

java - H2用户自定义函数被多次调用

arrays - 有条件地投影匹配数组项

unicode - Unicode Collat​​ion Algorithm 中组合字符的处理是如何工作的?

java - 使用 java.sql.ResultSet 中的列名和列值构建映射

java - Hazelcast:如何刷新 Hazelcast 实例?

arrays - 如何在 Swift 3 中将十六进制转换为十进制? (没有第三方库和Foundation的自写代码)

javascript - 如何显示没有索引的数组?

unicode - Unicode 基本多语言平面是否足以满足 CJK 使用者的需求?

Python:使用 punycode 无法正确解码 'Idna' 字符