我有一些文本字符串需要处理,字符串内部有HTML特殊字符。例如:
10����������������10������������������
我想将这些字符转换为 utf-8。
我使用了org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4,但没有任何运气。有没有简单的方法来解决这个问题?
Apache commons-text library具有具有unescapeHtml4()
实用程序方法的StringEscapeUtils
类。
String utf8Str = StringEscapeUtils.unescapeHtml4(htmlStr);
您可能还需要unescapeXml()
@Bohemian的代码是正确的,它对我有用,您的未编码字符串是 10😭😭😂😂😂😂😢😂10😭😭😂😂😂😂😢😂😂。
现在,我添加另一个答案,而不是评论波西米亚的答案,因为还有两件事需要提及:
-
我将您的字符串复制粘贴到 HTML 代码中,浏览器无法正确呈现您的字符,因为您的字符串编码不正确,即字符串分别对两个字节字符的高代理项和低代理项进行了编码,而不是对整个代码点进行编码(似乎原始字符串是 UTF-16 编码的字符串,也许是 Java 字符串?
-
您希望将字符串重新编码为 UTF-8。
一旦你的字符串被StringEscapeUtils.unescapeHtml(htmlStr)
取消编码(尽管编码不正确,但它成功地取消了你的字符串编码(,谈论"字符串编码"就没有多大意义了,因为java字符串"不知道"编码。(不过他们在内部使用 UTF-16(。
如果您需要一组包含 UTF-8 编码"字符串"的字节,则需要从编码为 UTF-8 的字符串中获取"原始"字节:
String javaStr = StringEscapeUtils.unescapeHtml(htmlStr);
byte[] rawUft8String = javaStr.getBytes("UTF-8");
并根据需要使用这样的字节数组。
现在,如果您需要将 UTF-8 编码字符串写入文件,而不是该字节数组,则需要在创建正确的java.io.Writer
时指定编码。
尝试以下代码对字符串进行解码(首先更改文件路径(,然后在任何支持 UTF-8 的编辑器中打开生成的文件:
java.io.Writer 方法(更好(:
public static void main(String[] args) throws IOException {
String str = "10����������������10������������������";
String javaString = StringEscapeUtils.unescapeHtml(str);
try(Writer output = new OutputStreamWriter(
new FileOutputStream("/path/to/testing.txt"), "UTF-8")) {
output.write(javaString);
}
}
java.io.OutputStream 方法(如果你已经有一个"原始字符串"(:
public static void main(String[] args) throws IOException {
String str = "10����������������10������������������";
String javaString = StringEscapeUtils.unescapeHtml(str);
try(OutputStream output = new FileOutputStream("/path/to/testing.txt")) {
for (byte b : javaString.getBytes(Charset.forName("UTF-8"))) {
output.write(b);
}
}
}