我正在尋找允許「規範化」文本的java庫。類似於標準Normalizer,但更寬(類似於utf8proc LUMP)。用於文本規範化的Java庫
它應該將所有類型的特殊字符替換爲ASCII等價物(如果可能的話)。編碼32的所有空間變體,編碼45的所有變體(長,短,細等),等等。
我正在尋找允許「規範化」文本的java庫。類似於標準Normalizer,但更寬(類似於utf8proc LUMP)。用於文本規範化的Java庫
它應該將所有類型的特殊字符替換爲ASCII等價物(如果可能的話)。編碼32的所有空間變體,編碼45的所有變體(長,短,細等),等等。
您應該看看CLDR中的Latin-ASCII變換。它將在ICU 4.6
謝謝你,看起來像一個很好的解決方案 – valodzka 2010-11-09 16:39:51
Latin-ASCII音譯器進入ICU 4.6/CLDR 1.9。 – 2011-07-29 00:10:56
你看過icu4j的Normalizer嗎?
normalize
將Unicode文本轉換爲等效的組合或分解形式,從而可以更輕鬆地排序和搜索文本。normalize
支持Unicode Standard Annex #15 — Unicode Normalization Forms中描述的標準歸一化形式。
是的,我查了一下。默認情況下,它不會做我需要的。我看過Normalizer2(http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Normalizer2.html),它可以配置,但它不是簡單的任務。 – valodzka 2010-11-05 23:04:24
您的具體要求是有點模糊,但我想你想的是做什麼Normalizer做的事情,但隨着功能的某些Unicode代碼點一概而論一個字符 - 類似utf8proc。
我會去一個2步的方法:
兩者都應該是直截了當的。對於2,如果您正在處理基本多語言窗格以外的字符,則使用appropriate algorithm for doing so遍歷代碼點。如果您只使用BMP代碼點,則只需遍歷字符。
對於您想一概而論,該映射ununified代碼點創建一個替換數據結構中的字符 - >統一代碼點。 Map<Character, Character>
或Map<Integer, Integer>
想到這一點。根據您的喜好填充替換地圖,例如通過從utf8proc的lump.txt和character 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對象。
PS:看起來我必須實現它。任何想法如何做到這一點? – valodzka 2010-11-08 10:36:34