2014-02-19 168 views
2

如果我有一個字符串爪哇 - 替換所有非ASCII但留下HTML特殊字符

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

我願把所有的ASCII字符的HTML實體,但刪除任何其他編碼。

我試圖

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

但這消除像商標和版權

的東西有沒有辦法讓HTML實體,但去除所有其他的編碼?

+4

_但這會去除諸如商標和copyright_這些東西 - 這些不在ASCII範圍內。通常,您可以按範圍或類別進行過濾,但您必須更具體地說明哪些[代碼點](http://www.unicode.org/charts/)是允許的,哪些不是。大約有25萬個代碼點已被分配。 – McDowell

回答

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是一個方便的工具類與逃生/ unescape htmls, csvs, xmls

因此,我首先使用NFD來規範字符串來規避escapeHtml3進程(否則每個重音字符都會被其重音對應字符替換)。

現在,當我轉義Html時,copyright符號被轉義而不影響重音。刪除非ASCII部分後,重音被替換爲其對應部分,但copyright仍然可以轉義,我可以很容易地將unescapeHtml3恢復爲其原始形式。

你可以通過各自的鏈接獲得更多關於我在這種情況下試圖利用的行爲的觀點。

+1

這很好。 Normalize和EscapeHtml做什麼?哪一個轉換角色? – sln

+0

@sln我已經更新了這篇文章的細節和鏈接,基本上'Normalize'是一個重要的類,它提供了一種在Java中標準化字符串的好方法。 'StringEscapeUtils'有非常方便的實用方法來工作htmls,xmls等 – PopoFibo

3

可以使用\\p{ASCII}屬性:

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

或者使用\\P{ASCII}

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

這是U + 0000到U + 007F – sln