Java(Android)中可靠还原HTML字符的方案求助
解决HTML字符实体还原的全面方案
首先帮你捋下当前的问题:你用org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4()处理–时测试报错,大概率不是工具本身的问题——Commons Lang3 3.11版本其实已经支持–这类HTML4实体的转换。你看到的ComparisonFailure更可能是测试环境的编码显示问题(比如JUnit控制台输出的字符编码不对,导致–显示成了?)。你可以在测试里打印字符的Unicode码点验证:
String expected = "–"; String actual = org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4("–"); System.out.println("Expected code point: " + (int) expected.charAt(0)); // 输出8211 System.out.println("Actual code point: " + (int) actual.charAt(0)); // 正常应该也是8211
如果码点一致,那就是显示问题,而非转换失败。
回到你的核心需求:有没有无需hack就能还原所有标准HTML字符实体的方法?这里给你两个靠谱的选项:
1. 优先确认Commons Lang3的适配性
如果你只想用Commons家族工具,建议升级到最新版本(目前最新是3.14.0),它支持绝大多数HTML4实体。但它的局限性是:对HTML5新增的部分特殊实体(比如部分表情类实体)支持不如专门的HTML解析库全面。
2. 使用Jsoup(推荐)
Jsoup是专门处理HTML的库,完全遵循HTML规范,能处理所有标准HTML4/HTML5实体,甚至能解析复杂HTML片段里的实体,是更可靠的选择。
代码示例
import org.jsoup.Jsoup; import org.junit.Assert; import org.junit.Test; public class HtmlEntityTest { @Test public void unescapeHtmlWithJsoup() { // 测试基础实体 String sample1 = "<"; Assert.assertEquals("<", Jsoup.parse(sample1).text()); // 测试短破折号实体 String sample2 = "–"; Assert.assertEquals("–", Jsoup.parse(sample2).text()); // 测试HTML5新增实体(比如爱心表情) String sample3 = "&heart;"; Assert.assertEquals("♥", Jsoup.parse(sample3).text()); } }
Gradle配置
implementation group: 'org.jsoup', name: 'jsoup', version: '1.17.2'
Jsoup的parse()方法会自动解析所有HTML实体,text()方法提取纯文本内容,完美解决实体还原问题。
为什么不推荐自定义hack?
自定义实体映射不仅维护成本高,还容易遗漏标准实体,而且HTML规范一直在更新,自己维护的映射很容易过时,用成熟的库是更稳妥的选择。
内容的提问来源于stack exchange,提问作者mcfly soft
相关产品推荐
相关产品推荐

