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

时间:2015-01-06 02:56:02

标签: java unicode encoding

enter code here我遇到了html编码问题。 我有一个带有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.

我试图找到解决方案为this sugest,但它只对字符串有帮助,所有字符的格式都以&#开头。字符以&xxxx开头,由此page我得到的编码是html编码,但我的输入字符串是转换HTML实体(命名)和HTML实体(十进制)的组合。

任何人都可以给我一个建议吗? 如果你能在java中没有任何额外的库来解决它,那就是最好的。

提前感谢!

[更新] 我使用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.

4 个答案:

答案 0 :(得分:0)

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

/**
 * https://stackoverflow.com/a/6766497/8356718
 */
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

答案 1 :(得分:0)

使用Apache Commons StringEscapeUtils.unescapeHtml(string)进行此操作。

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

答案 2 :(得分:0)

您可能需要尝试进行编码和解码。

用于编码

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

用于解码

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

答案 3 :(得分:-2)

在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();