防止Jsoup将utf-8转换为utf-16

问题描述 投票:0回答:1

我希望以下内容按照提供的方式返回编码的项目符号点:

Jsoup.parse("<div>&#8226;</div>").text()

但是我得到了一个 utf-16 字符串,其中带有显示为黑色圆圈的项目符号。这会导致 Chrome 中出现渲染问题,因为页面的其余部分是 utf-8。从我发现的许多其他问题中,我认为这可能有用

Parser.unescapeEntities(Jsoup.parse("<div>&#8226;</div>").text(), true)

但回想起来,我发现这样做恰恰相反,它将转义的内容变成了未转义的内容。

我发现一些建议,html需要在头部声明utf-8编码才能按照我希望的方式解析,但是这个有效的html仍然变成utf-16

<!DOCTYPE html>
  <html lang='en'><head><title>foo</title><meta charset='UTF-8'></head>
  <body>&#8226;</body>
</html>

特别是,我正在使用 Jsoup 从之前生成的 html 中解析出一个元素并返回原始 html 文本,例如

Jsoup.parse(myHtml).getElementsByClass("myClass").first().toString()

问题:如何使用 Jsoup 解析出包含 utf-16 字符的 utf-8 表示形式的 html 片段,而不将该内容转换为 utf-16?

utf-8 jsoup utf-16
1个回答
0
投票

我不认为这与 UTF-16 有任何关系。该项目符号字符可以用 UTF-8 表示。如果您在作为 UTF-8 的页面中使用解码后的表单,它将正确显示。我想您的服务方式一定存在另一个问题,即下降到 ascii 或其他编码。

直接回答您的问题:

Element.text()
方法始终返回解码后的文本

要获取编码的 HTML,您应该使用

Element.html()
方法。现在,默认以 UTF-8 输出,并且 jsoup 仅在输出字符集不支持该字符时将字符转义为实体,因此形式将是相同的。由于您似乎也不想要 UTF-8,因此您可以根据需要配置 OutputSettings

这是一个有效的例子:

Document doc = Jsoup.parse("<div>&#8226;</div>");
Element div = doc.expectFirst("div");
print("Text", div.text());
print("HTML Default", div.html());

doc.outputSettings().charset("UTF-8");
print("HTML UTF8", div.html());

doc.outputSettings().charset("ascii");
print("HTML ascii", div.html());

doc.outputSettings().escapeMode(Entities.EscapeMode.extended);
print("HTML extended", div.html());

print("Text", div.text()); // shows text() is always decoded

给予:

Text: •
HTML Default: •
HTML UTF8: •
HTML ascii: &#x2022;
HTML extended: &bull;
Text: •

&#x2022;
&8226;
相同,采用 十六进制与十进制 编码。

© www.soinside.com 2019 - 2024. All rights reserved.