StringEscapeUtils 不处理 utf-8

Sha*_*ank 4 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>";
Run Code Online (Sandbox Code Playgroud)

我正在使用 StringEscapeUtils 转义它

import org.apache.commons.text.StringEscapeUtils;
String escaped = StringEscapeUtils.escapeJava(incoming);
Run Code Online (Sandbox Code Playgroud)

结果是

<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>
Run Code Online (Sandbox Code Playgroud)

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

这是我尝试过的:

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

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

sko*_*isa 5

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

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

一个简单的方法来去除Unicode转义字符在返回的字符串的StringEscapeUtils.escapeJava()方法是调用translate()的方法UnicodeUnescaper()

将 \u+\d\d\d\d 形式的转义 Unicode 值转换回 Unicode。它支持多个 'u' 字符并且可以使用或不使用 +。

所以调用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.
}
Run Code Online (Sandbox Code Playgroud)

这是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)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 一定要使用 package org.apache.commons.text.translatefor UnicodeUnescaper. 中存在较旧的弃用版本org.apache.commons.lang3.text.translate这是当前版本为 1.8 的 Apache Commons Text 下载页面的链接
  • 这不是一个理想的解决方案,因为它正在调用UnicodeUnescaper.translate()修复由StringEscapeUtils.escapeJava(). 可能还有其他更简洁的方法(通过使用 的替代方法StringEscapeUtils.escapeJava()),但这种方法似乎对您的数据有效。