如果我有一個字符串爪哇 - 替換所有非ASCII但留下HTML特殊字符
String mine = "Some Name ® plus encoding issue ????? \u0000 something ";
我願把所有的ASCII字符的HTML實體,但刪除任何其他編碼。
我試圖
mine.replaceAll("[^\\x00-\\x7F]", "");
但這消除像商標和版權
的東西有沒有辦法讓HTML實體,但去除所有其他的編碼?
如果我有一個字符串爪哇 - 替換所有非ASCII但留下HTML特殊字符
String mine = "Some Name ® plus encoding issue ????? \u0000 something ";
我願把所有的ASCII字符的HTML實體,但刪除任何其他編碼。
我試圖
mine.replaceAll("[^\\x00-\\x7F]", "");
但這消除像商標和版權
的東西有沒有辦法讓HTML實體,但去除所有其他的編碼?
您可以使用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是一個方便的工具類與逃生/ unescape htmls, csvs, xmls
。
因此,我首先使用NFD來規範字符串來規避escapeHtml3
進程(否則每個重音字符都會被其重音對應字符替換)。
現在,當我轉義Html時,copyright
符號被轉義而不影響重音。刪除非ASCII部分後,重音被替換爲其對應部分,但copyright
仍然可以轉義,我可以很容易地將unescapeHtml3
恢復爲其原始形式。
你可以通過各自的鏈接獲得更多關於我在這種情況下試圖利用的行爲的觀點。
可以使用\\p{ASCII}
屬性:
mine = mine.replaceAll("[^\\p{ASCII}]+", "");
或者使用\\P{ASCII}
:
mine = mine.replaceAll("\\P{ASCII}+", "");
這是U + 0000到U + 007F – sln
_但這會去除諸如商標和copyright_這些東西 - 這些不在ASCII範圍內。通常,您可以按範圍或類別進行過濾,但您必須更具體地說明哪些[代碼點](http://www.unicode.org/charts/)是允許的,哪些不是。大約有25萬個代碼點已被分配。 – McDowell