如何在Java中unescape html特殊字符?

时间:2014-04-30 23:10:17

标签: java

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

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

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

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

2 个答案:

答案 0 :(得分:3)

Apache commons-lang库具有StringEscapeUtils类,其具有unescapeHtml()实用程序方法。

String utf8Str = StringEscapeUtils.unescapeHtml(htmlStr);

您可能还需要unescapeXml()

答案 1 :(得分:0)

@Bohemian的代码是正确的,它适用于我,你的未编码字符串是1010。

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

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

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

  3. 一旦你的字符串未被StringEscapeUtils.unescapeHtml(htmlStr)解码(尽管编码错误,它成功地解码了你的字符串),但由于java字符串“不知道”关于“字符串编码”,所以没有多少意义编码。 (他们虽然在内部使用UTF-16。)

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

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

    无论你需要什么,都可以使用这样的字节数组。

    现在,如果您需要将UTF-8编码的字符串写入File,而不是该字节数组,则需要在创建正确的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);
            }
        }
    
    }