Как преобразовать строку с 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)
за это.
Возможно, вам придется попробовать это для кодирования и декодирования.
Для кодирования
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("&", "&");
}
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
первый