Как преобразовать строку с HTML-кодировкой в ​​Unicode в Java

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.

Я хочу конвертировать эту строку в Unicode. Его вывод (фактическое значение) должен быть

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

Я попытался найти решение, как это Sugest, но это может помочь для строки со всеми символами, формат которых начинается с &#, с символами начинаются с &xxxxНа этой странице я получил кодирование html-кодирования, но моя входная строка представляет собой сочетание преобразования HTML Entity (именованный) и HTML Entity (десятичный).

Может кто-нибудь, пожалуйста, дайте мне предложение? Лучше всего, если вы сможете решить эту проблему без какой-либо дополнительной библиотеки в Java.

заранее спасибо!

[ОБНОВЛЕНИЕ] Я решил свою проблему с помощью библиотеки Apache:

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.

3 ответа

Решение

В 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();,

Используйте Apache Commons StringEscapeUtils.unescapeHtml(string) за это.

См. Java: Как удалить символы HTML в Java?

Возможно, вам придется попробовать это для кодирования и декодирования.

Для кодирования

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

Для декодирования

URLDecoder.decode("%3C%23%3E%20Test");
maven:
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.9.2</version>
</dependency>    

/**
 * https://stackru.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 первый

Другие вопросы по тегам