2010-11-05 61 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对象。