我希望以下内容按照提供的方式返回编码的项目符号点:
Jsoup.parse("<div>•</div>").text()
但是我得到了一个 utf-16 字符串,其中带有显示为黑色圆圈的项目符号。这会导致 Chrome 中出现渲染问题,因为页面的其余部分是 utf-8。从我发现的许多其他问题中,我认为这可能有用
Parser.unescapeEntities(Jsoup.parse("<div>•</div>").text(), true)
但回想起来,我发现这样做恰恰相反,它将转义的内容变成了未转义的内容。
我发现一些建议,html需要在头部声明utf-8编码才能按照我希望的方式解析,但是这个有效的html仍然变成utf-16
<!DOCTYPE html>
<html lang='en'><head><title>foo</title><meta charset='UTF-8'></head>
<body>•</body>
</html>
特别是,我正在使用 Jsoup 从之前生成的 html 中解析出一个元素并返回原始 html 文本,例如
Jsoup.parse(myHtml).getElementsByClass("myClass").first().toString()
问题:如何使用 Jsoup 解析出包含 utf-16 字符的 utf-8 表示形式的 html 片段,而不将该内容转换为 utf-16?
我不认为这与 UTF-16 有任何关系。该项目符号字符可以用 UTF-8 表示。如果您在作为 UTF-8 的页面中使用解码后的表单,它将正确显示。我想您的服务方式一定存在另一个问题,即下降到 ascii 或其他编码。
Element.text()
方法始终返回解码后的文本。
Element.html()
方法。现在,默认以 UTF-8 输出,并且 jsoup 仅在输出字符集不支持该字符时将字符转义为实体,因此形式将是相同的。由于您似乎也不想要 UTF-8,因此您可以根据需要配置 OutputSettings。
这是一个有效的例子:
Document doc = Jsoup.parse("<div>•</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: •
HTML extended: •
Text: •
•
与 &8226;
相同,采用 十六进制与十进制 编码。