如何将 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 是最好的方式:
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("&", "&");
}
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");
我有一个 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 是最好的方式:
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("&", "&");
}
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");