我有一个UTF-8编码的HTML输入。在这个输入中,重音字符以HTML实体的形式呈现。例如:
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>árvíztűrő<b</body>
</html>
我的目标是在Java中尽可能地用utf-8字符替换html实体,以“规范化”html。换句话说,替换所有实体,除了
< > & " '
。
这个目标:
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>árvíztűrő<b</body>
</html>
我需要这个来使测试中比较html更容易,并且对于肉眼阅读更容易(大量转义的重音字符使得阅读非常困难)。
我不关心cdata部分(输入中没有cdata)。
我尝试过JSOUP(https://jsoup.org/)和Apache的Commons Text(https://commons.apache.org/proper/commons-text/),但都失败了:
public void test() throws Exception {
String html =
"<html><head><META http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" +
"</head><body>árvíztűrő<b</body></html>";
// this is not good, keeps only the text content
String s1 = Jsoup.parse(html).text();
System.out.println("s1: " + s1);
// this is better, but it unescapes the < which is not what I want
String s2 = StringEscapeUtils.unescapeHtml4(html);
System.out.println("s2: " + s2);
}
StringEscapeUtils.unescapeHtml4() 已经接近我所需,但不幸的是它也会将 < 进行反转义:
<body>árvíztűrő<b</body>
我该怎么做?