如何将 html 编码的字符串转换为 java 中的 Unicode

How to convert string with html encoding to Unicode in java

我有一个 HTML 编码的字符串,如下所示:

Ðột nhiên, ở gốc Tây Bắc văng vẳng có tiếng vó ngựa dồn dập.

我想将此 String 转换为 Unicode。 预期输出:

Ðột nhiên, ở gốc Tây Bắc văng vẳng có tiếng vó ngựa dồn dập.

我通过 Convert Decimal NCRs Code into UTF-8 in java (JSP) 找到了一个解决方案,但它只适用于所有字符格式以 &#.

开头的字符串

字符以 &xxxx 开头,使用页面 HTML encoding of foreign language characters 我得到它的编码是 html 编码,但我的输入字符串是转换 HTML 实体的组合(命名)和 HTML 实体(十进制)。

有人有什么建议吗? 如果我们能在不添加任何额外库的情况下做到这一点,那将是最好的。

[更新] 我使用 Apache library 解决了我的问题:

String encodeString = "Ðột nhiên, ở gốc Tây Bắc văng vẳng có tiếng vó ngựa dồn dập.";
    String unEncodeString = StringEscapeUtils.unescapeHtml4(encodeString);
    System.out.println("OUTPUT : " + unEncodeString);

=====> OUTPUT : Ðột nhiên, ở gốc Tây Bắc văng vẳng có tiếng vó ngựa dồn dập.

在 Java 中,对于 unicode 字符串文字,您在数字前执行 \u

例如:

System.out.println("\u0042");
System.out.println("\u00AF\_(\u30C4)_/\u00AF");

打印:

B
¯\_(ツ)_/¯

你想要的是:

System.out.println("\u00D0\u1ED9t nhi\u00EAn, \u1EDF g\u1ED1c T\u00E2y B\u1EAFc v\u0103ng v\u1EB3ng c\u00F3 ti\u1EBFng v\u00F3 ng\u1EF1a d\u1ED3n d\u1EADp.\n");

打印:

Ðột nhiên, ở gốc Tây Bắc văng vẳng có tiếng vó ngựa dồn dập.

编辑:Apache commons 是最好的方式:

StringEscapeUtils.unescapeHtml4();.

maven:
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.9.2</version>
</dependency>    

/**
 * 
 */
public static String toDecimal(String text) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < text.length(); i++) {
        int codePoint = text.codePointAt(i);
        // Skip over the second char in a surrogate pair
        if (codePoint > 0xffff) {
            i++;
        }
        sb.append(String.format("&#%s;", codePoint));
    }
    return sb.toString();
}

public static Document getNoPrettyDoc(String html) {
    Document doc = Jsoup.parse(html);
    doc.outputSettings().prettyPrint(false);
    return doc;
}

public static String toDecimalHtml(String html) {
    Document doc = getNoPrettyDoc(html);
    toDecimalHtml(doc);
    return doc.body().html().trim().replace("&amp;", "&");
}

private static void toDecimalHtml(Node node) {
    for (int i = 0; i < node.childNodes().size(); ) {
        Node child = node.childNode(i);
        if (child.nodeName().equals("#text")) {
            TextNode text = (TextNode) child;
            String str = text.getWholeText();
            text.text(toDecimal(str));
            if (child.childNodes().size() <= 0) {
                i++;
            }
        } else {
            if (child.childNodes().size() > 0) {
                toDecimalHtml(child);
            }
            i++;
        }
    }
}

您可能需要先删除:\n \r \t

为此使用 Apache Commons StringEscapeUtils.unescapeHtml(string)

参考:Java: How to unescape HTML character entities in Java?

您可能需要尝试使用此方法进行编码和解码。

用于编码

URLEncoder.encode("<#> Test", "UTF-8").replace("+", "%20");

用于解码

URLDecoder.decode("%3C%23%3E%20Test");