2010-11-05 58 views
10

我正在尋找允許「規範化」文本的java庫。類似於標準Normalizer,但更寬(類似於utf8proc LUMP)。用於文本規範化的Java庫

它應該將所有類型的特殊字符替換爲ASCII等價物(如果可能的話)。編碼32的所有空間變體,編碼45的所有變體(長,短,細等),等等。

+0

PS:看起來我必須實現它。任何想法如何做到這一點? – valodzka 2010-11-08 10:36:34

回答

2

您應該看看CLDR中的Latin-ASCII變換。它將在ICU 4.6

+0

謝謝你,看起來像一個很好的解決方案 – valodzka 2010-11-09 16:39:51

+1

Latin-ASCII音譯器進入ICU 4.6/CLDR 1.9。 – 2011-07-29 00:10:56

1

你看過icu4j的Normalizer嗎?

normalize將Unicode文本轉換爲等效的組合或分解形式,從而可以更輕鬆地排序和搜索文本。 normalize支持Unicode Standard Annex #15 — Unicode Normalization Forms中描述的標準歸一化形式。

+0

是的,我查了一下。默認情況下,它不會做我需要的。我看過Normalizer2(http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Normalizer2.html),它可以配置,但它不是簡單的任務。 – valodzka 2010-11-05 23:04:24

4

您的具體要求是有點模糊,但我想你想的是做什麼Normalizer做的事情,但隨着功能的某些Unicode代碼點一概而論一個字符 - 類似utf8proc。

我會去一個2步的方法:

  1. 首先使用Normalizer.normalize創造一切(去)組成你想
  2. 然後通過結果的代碼點迭代,並更換統一字符你喜歡它的方式。

兩者都應該是直截了當的。對於2,如果您正在處理基本多語言窗格以外的字符,則使用appropriate algorithm for doing so遍歷代碼點。如果您只使用BMP代碼點,則只需遍歷字符。

對於您想一概而論,該映射ununified代碼點創建一個替換數據結構中的字符 - >統一代碼點Map<Character, Character>Map<Integer, Integer>想到這一點。根據您的喜好填充替換地圖,例如通過從utf8proc的lump.txtcharacter categories的來源獲取信息。

Map<Character, Character> LUMP; 

static { 
    LUMP = new HashMap<Character, Character>(); 
    LUMP.put('\u2216', '\\'); // set minus 
    LUMP.put('\u007C', '|'); // divides 
    // ... 
} 

創建一個新的StringBuilder或類似的大小與標準化字符串相似。在迭代代碼點時,檢查LUMP.get(codePoint)是否爲非空值。在這種情況下,添加返回的值,否則將代碼點添加到StringBuilder。應該是這樣的。

如果需要,您可以支持從配置中加載LUMP內容的方式,例如,從Properties對象。