【问题标题】:Java - replace all non-ASCII but leave HTML special charactersJava - 替换所有非 ASCII 但保留 HTML 特殊字符
【发布时间】:2014-02-19 17:28:35
【问题描述】:

如果我有一个字符串

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

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

我试过了

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

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

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

【问题讨论】:

  • 但这会删除商标和版权等内容 - 这些不在 ASCII 范围内。通常,您可以按范围或类别进行过滤,但您必须更具体地确定哪些code points 是允许的,哪些是不允许的。已分配大约 250K 个代码点。

标签: java regex


【解决方案1】:

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

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

或者使用\\P{ASCII}:

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

【讨论】:

  • 这是 U+0000 到 U+007F
【解决方案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 来规范化字符串以规避escapeHtml3 过程(否则每个重音字符将被其重音字符替换)。

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

您可以浏览各个链接,以更深入地了解我在这种情况下试图利用的行为。

【讨论】:

  • 这很好。 Normalize 和 EscapeHtml 做什么?哪个转换了中心字符?
  • @sln 我已经用详细信息和链接更新了帖子,基本上Normalize 是一个重要的类,它提供了一种在 Java 中规范化字符串的好方法。 StringEscapeUtils 有非常方便的实用方法来处理 html、xml 等
猜你喜欢
  • 2014-02-05
  • 2023-03-12
  • 2012-11-06
  • 1970-01-01
  • 2013-08-24
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多