首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringEscapeUtils不处理utf-8

StringEscapeUtils不处理utf-8
EN

Stack Overflow用户
提问于 2019-12-11 07:19:15
回答 1查看 3.8K关注 0票数 5

我有一根这样的绳子

代码语言:javascript
复制
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逃离了它

代码语言:javascript
复制
import org.apache.commons.text.StringEscapeUtils;
String escaped = StringEscapeUtils.escapeJava(incoming);

结果是

代码语言:javascript
复制
<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,但它不起作用,有任何方法可以修复它吗?

以下是我尝试过的:

字符串s=新字符串(escaped.getBytes(“UTF-8”),"UTF-8");

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-14 05:14:31

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

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

StringEscapeUtils.escapeJava()返回的字符串中删除Unicode转义的一个简单方法是调用班级translate()方法。

将表单\u+\d\d的转义Unicode值转换回Unicode。它支持多个'u‘字符,并将使用或不使用+。

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

  • 将转义字符保留在字符串中,如双引号,不受影响。
  • 将Unicode文本替换为它们的希腊字符等价物。例如,\u03C4将更改为τ

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

代码语言:javascript
复制
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()调用的输出:

代码语言:javascript
复制
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)

备注:

  • 确保将包org.apache.commons.text.translate用于UnicodeUnescaperorg.apache.commons.lang3.text.translate中存在旧的不推荐版本。这是一个链接到Apache的下载页面,当前版本为1.8。
  • 这不是一个理想的解决方案,因为它调用UnicodeUnescaper.translate()来修复StringEscapeUtils.escapeJava()造成的混乱。可能还有其他更干净的方法(通过使用StringEscapeUtils.escapeJava()的替代方案),但是这种方法似乎对您的数据很好。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59280607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档