Java - 替换所有非ASCII但保留HTML特殊字符

时间:2014-02-19 17:28:35

标签: java regex

如果我有一个字符串

String mine = "Some Name ® plus encoding issue ????? \u0000 something ";

我想保留所有ASCII字符和HTML实体,但删除任何其他编码。

我试过

mine.replaceAll("[^\\x00-\\x7F]", ""); 

但这会删除商标和版权等内容

有没有办法保留HTML实体但删除所有其他编码?

2 个答案:

答案 0 :(得分:3)

您可以使用\\p{ASCII}属性:

mine = mine.replaceAll("[^\\p{ASCII}]+", "");

或者使用\\P{ASCII}

mine = mine.replaceAll("\\P{ASCII}+", "");

答案 1 :(得分:2)

您可以使用NormalizeEscapeHtml的组合来实现它,并且具有相当高的准确度:

String mine = "site design / logo © 2014 stack exchange inc; árvíztűrő tükörfúrógép";
mine = Normalizer.normalize(mine, Normalizer.Form.NFD); // Normalize with Canonical decomposition
mine = StringEscapeUtils.escapeHtml3(mine); // Escape the html values now
System.out.println(mine); // Would be - site design / logo © 2014 stack exchange inc; árvíztűrő tükörfúrógép

mine = mine.replaceAll("[^\\p{ASCII}]", "");
mine = StringEscapeUtils.unescapeHtml3(mine); // Unescape
System.out.println(mine); // site design / logo © 2014 stack exchange inc; arvizturo tukorfurogep
带有规范分解的

Normalize会将重音字符(在本例中)映射到它们的,规范的分解值。 (链接提供了一个很好的资源)

StringEscapeUtils是一个方便的实用工具类,包含escape / unescape htmls, csvs, xmls

因此,我首先使用NFD来规范化String以避开escapeHtml3进程(否则每个重音字符将被其重音对象替换)。

现在当我转义Html时,copyright符号会在不影响重音的情况下被转义。删除非ascii部分后,重音被其对应部分替换,但copyright仍然被转义,我可以轻松地将unescapeHtml3恢复为原始形式。

您可以浏览相应的链接,了解我在这种情况下尝试利用的行为的更多视角。