StringEscapeUtils 不处理 utf-8
StringEscapeUtils not handling utf-8
我有这样的字符串
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()
编辑的字符串 return 中转义为 \u03C4
。我不知道为什么 escapeJava()
这样做。 Its Javadoc 声明“使用 Java 字符串规则转义字符串中的字符。”但我找不到“[ 的正式定义=67=] 字符串规则".
删除由 StringEscapeUtils.escapeJava()
编辑的字符串 return 中的 Unicode 转义符的一个简单方法是调用 the UnicodeUnescaper()
class 的 translate()
方法:
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()
将 return 一个 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)
备注:
- 一定要为
UnicodeUnescaper
使用包 org.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()
的替代方法),但这种方法似乎适用于您的数据。
我有这样的字符串
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()
编辑的字符串 return 中转义为 \u03C4
。我不知道为什么 escapeJava()
这样做。 Its Javadoc 声明“使用 Java 字符串规则转义字符串中的字符。”但我找不到“[ 的正式定义=67=] 字符串规则".
删除由 StringEscapeUtils.escapeJava()
编辑的字符串 return 中的 Unicode 转义符的一个简单方法是调用 the UnicodeUnescaper()
class 的 translate()
方法:
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()
将 return 一个 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)
备注:
- 一定要为
UnicodeUnescaper
使用包org.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()
的替代方法),但这种方法似乎适用于您的数据。