Jsoup unescapes特殊字符

时间:2015-12-19 08:46:25

标签: html character-encoding escaping jsoup

我正在使用Jsoup从HTML页面中删除所有图像。 我通过HTTP响应接收页面 - 它还包含内容字符集。

问题是Jsoup取消了一些特殊字符。

例如,输入:

<html><head></head><body><p>isn&rsquo;t</p></body></html>

运行后

String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>";
Document doc = Jsoup.parse(check);
System.out.println(doc.outerHtml());

我明白了:

<html><head></head><body><p>isn’t</p></body></html><p></p>

除了删除图片之外,我想避免以任何其他方式更改html

使用命令:

doc.outputSettings().prettyPrint(false).charset("ASCII").escapeMode(EscapeMode.extended);

我确实得到了正确的输出,但我确信有些情况下这种字符集不会很好。我只想使用HTTP标头中指定的字符集,我担心这会以我无法预测的方式更改我的文档。 有没有其他更清洁的方法来删除图像而不会无意中改变其他任何东西?

谢谢!

1 个答案:

答案 0 :(得分:4)

这是一种不涉及任何字符集的解决方法,除了HTTP标头中指定的字符集。

String check = "<html><head></head><body><p>isn&rsquo;t</p></body></html>".replaceAll("&([^;]+?);", "**$1;");

Document doc = Jsoup.parse(check);

doc.outputSettings().prettyPrint(false).escapeMode(EscapeMode.extended);

System.out.println(doc.outerHtml().replaceAll("\\*\\*([^;]+?);", "&$1;"));

<强>输出

<html><head></head><body><p>isn&rsquo;t</p></body></html>

<强>讨论

  

我希望Jsoup的API有一个解决方案 - @dlv

使用Jsoup'API需要您编写自定义NodeVisitor。这将导致(重新)发明Jsoup中的一些现有代码。自定义Nodevisitor将生成HTML转义码而不是unicode字符。

另一种选择涉及编写自定义字符编码器。默认的UTF-8字符编码器可以编码&rsquo;。这就是为什么Jsoup不保留最终HTML代码中的原始转义序列。

上述两个选项中的任何一个都代表了大量的编码工作。最终,可以向Jsoup添加一个增强功能,让我们选择如何在最终的HTML代码中生成字符:十六进制转义(&#AB;),十进制转义(&#151;),原始转义序列({ {1}})或写入编码字符(在帖子中就是这种情况)。