Jsoup处理HTML时无法按预期转义重音字符等实体的问题问询
Jsoup重音字符转义失效问题修复方案
问题原因
你设置的Entities.EscapeMode.extended未生效,是因为Jsoup默认输出字符集为UTF-8,对于UTF-8可正常展示的非ASCII字符(包括各类重音字符),默认不会触发实体转义逻辑,只有当输出字符集不支持对应字符时,才会自动转义为HTML实体。
修复要点
- 输出设置中新增字符集配置,指定为ASCII,强制所有非ASCII字符转义为对应HTML实体
- 修正节点替换逻辑,避免提前解析实体导致转义失效
修复后代码
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Entities; import org.jsoup.nodes.TextNode; import org.jsoup.select.Elements; import java.nio.charset.StandardCharsets; public class JsoupWrapper { public static void main(String[] args) { String s = "<p style=\"text-align: justify;\">Cet amendement vise à rectifier le montant des annulations sur le programme 181 « Prévention des risques », de la mission « Écologie, développement et mobilités durables », en l’abaissant de 24,2 M€.</p>\n" + "<p style=\"text-align: justify;\">Cette minoration des annulations est proposée dans le cadre du redéploiement de crédits du programme d’investissements d’avenir (PIA) depuis les actions du PIA portées par l’Agence de l’environnement et de la maîtrise de l’énergie (ADEME), vers l’action « Equipex » portée par l’Agence nationale de la recherche (ANR), pour financer les projets « Microcarb » et « Polar Pod ». Le redéploiement concernera pour l’ADEME l’action « Véhicules et transporteurs du futur », à hauteur de 40 M€ et l’action « Démonstrateurs de la transition énergétique », à hauteur de 10,8 M€. Le soutien aux deux projets « Microcarb » et « Polar Pod » demeure complet, cette modification constituant un simple ajustement qui permet, tout en maintenant le soutien à « Polar Pod » et « Microcarb », de préserver des moyens sur l’action « Véhicules et transporteurs du futur » du PIA en vue de la conclusion des assises de la mobilité.</p>\n" + "<p style=\"text-align: justify;\">Cet amendement est complété par un amendement miroir sur le programme 172 « Recherches scientifiques et technologiques pluridisciplinaires », de la mission « Recherche et enseignement supérieur ».</p>"; System.out.println(cleanToBeforeRevision(s)); } public static String cleanToBeforeRevision(String html) { if (html == null) { return null; } Document doc = Jsoup.parse(html); // 核心修改:指定输出字符集为ASCII,配合extended转义模式 doc.outputSettings() .prettyPrint(false) .escapeMode(Entities.EscapeMode.extended) .charset(StandardCharsets.US_ASCII.name()); Elements toReverts = doc.select("span.ins"); Elements toRestores = doc.select("span.del, span[data-userid], span[data-username]"); toReverts.forEach(org.jsoup.nodes.Node::remove); toRestores.forEach(toRestore->{ // 修正:取文本内容而非html内容,避免提前解析实体 TextNode text = new TextNode(toRestore.text()); toRestore.replaceWith(text); }); return doc.body().html(); } }
效果说明
该修复适配你使用的Jsoup 1.12.1版本,修改后输出的HTML会自动将à转为à、é转为é,同时<、>、"等HTML特殊字符也会正常转义,最终输出为符合要求的有效HTML格式。
内容的提问来源于stack exchange,提问作者Alexis Dufrenoy
相关产品推荐
相关产品推荐

