You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 = "&ndash;";
        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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:03:08