如果我有一个字符串
String mine = "Some Name ® plus encoding issue ????? \u0000 something ";
我想保留所有ASCII字符和HTML实体,但删除任何其他编码。
我试过
mine.replaceAll("[^\\x00-\\x7F]", "");
但这会删除商标和版权等内容
有没有办法保留HTML实体但删除所有其他编码?
答案 0 :(得分:3)
您可以使用\\p{ASCII}
属性:
mine = mine.replaceAll("[^\\p{ASCII}]+", "");
或者使用\\P{ASCII}
:
mine = mine.replaceAll("\\P{ASCII}+", "");
答案 1 :(得分:2)
您可以使用Normalize
和EscapeHtml
的组合来实现它,并且具有相当高的准确度:
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
恢复为原始形式。
您可以浏览相应的链接,了解我在这种情况下尝试利用的行为的更多视角。