我正在寻找允许“规范化”文本的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