如何在 Java 中取消转义 html 特殊字符



我有一些文本字符串需要处理,字符串内部有HTML特殊字符。例如:

10����������������10������������������

我想将这些字符转换为 utf-8。

我使用了org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4,但没有任何运气。有没有简单的方法来解决这个问题?

Apache commons-text library具有具有unescapeHtml4()实用程序方法的StringEscapeUtils类。

String utf8Str = StringEscapeUtils.unescapeHtml4(htmlStr);

您可能还需要unescapeXml()

@Bohemian的代码是正确的,它对我有用,您的未编码字符串是 10😭😭😂😂😂😂😢😂10😭😭😂😂😂😂😢😂😂。

现在,我添加另一个答案,而不是评论波西米亚的答案,因为还有两件事需要提及:

  1. 我将您的字符串复制粘贴到 HTML 代码中,浏览器无法正确呈现您的字符,因为您的字符串编码不正确,即字符串分别对两个字节字符的高代理项和低代理项进行了编码,而不是对整个代码点进行编码(似乎原始字符串是 UTF-16 编码的字符串,也许是 Java 字符串?

  2. 您希望将字符串重新编码为 UTF-8。

一旦你的字符串被StringEscapeUtils.unescapeHtml(htmlStr)取消编码(尽管编码不正确,但它成功地取消了你的字符串编码(,谈论"字符串编码"就没有多大意义了,因为java字符串"不知道"编码。(不过他们在内部使用 UTF-16(。

如果您需要一组包含 UTF-8 编码"字符串"的字节,则需要从编码为 UTF-8 的字符串中获取"原始"字节:

String javaStr = StringEscapeUtils.unescapeHtml(htmlStr);
byte[] rawUft8String = javaStr.getBytes("UTF-8");

并根据需要使用这样的字节数组。

现在,如果您需要将 UTF-8 编码字符串写入文件,而不是该字节数组,则需要在创建正确的java.io.Writer时指定编码。

尝试以下代码对字符串进行解码(首先更改文件路径(,然后在任何支持 UTF-8 的编辑器中打开生成的文件:

java.io.Writer 方法(更好(:

public static void main(String[] args) throws IOException {
    String str = "10����������������10������������������";
    String javaString = StringEscapeUtils.unescapeHtml(str);
    try(Writer output = new OutputStreamWriter(
            new FileOutputStream("/path/to/testing.txt"), "UTF-8")) {
        output.write(javaString);
    }
}

java.io.OutputStream 方法(如果你已经有一个"原始字符串"(:

public static void main(String[] args) throws IOException {
    String str = "10����������������10������������������";
    String javaString = StringEscapeUtils.unescapeHtml(str);
    try(OutputStream output = new FileOutputStream("/path/to/testing.txt")) {
        for (byte b : javaString.getBytes(Charset.forName("UTF-8"))) {
            output.write(b);
        }
    }
}