用于文本规范化的Java库

我正在寻找允许文本“标准化”的java库。 类似于标准的Normalizer ,但更宽(类似于utf8proc LUMP)。

它应该将所有类型的特殊字符替换为ASCII等效字符(如果可能的话)。 代码为32的所有空间变体,所有变量的缺陷(长,短,薄等)到代码45等等。

您应该查看CLDR中的Latin-ASCII转换。 它将在ICU 4.6中

你的具体要求有点模糊,但我想你想要做一个与Normalizer相同的function,但是要将某些Unicode代码点汇总到一个字符 – 类似于utf8proc。

我会采取两步法:

  1. 首先使用Normalizer.normalize创建所需的任何(de-)合成
  2. 然后遍历结果的代码点并替换以您喜欢的方式统一字符。

两者都应该是直截了当的。 对于2,如果您正在处理Basic Multilingual Pane中的字符,那么使用适当的算法迭代代码点。 如果您只使用BMP代码点,那么只需遍历字符即可。

对于您想要拼凑在一起的字符,为映射未经 统一的代码点创建替换数据结构 – > 统一代码点 。 为此想到了MapMap 。 根据您的喜好填充替换映射,例如,从utf8proc的lump.txt获取信息,并获取字符类别的来源。

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

创建一个新的StringBuilder或类似的东西,其大小与规范化字符串相同。 迭代代码点时,检查LUMP.get(codePoint)是否为非null。 在这种情况下,添加返回的值,否则将代码点添加到StringBuilder。 那应该是它。

如果需要,您可以支持从配置加载LUMP内容的方法,例如从Properties对象加载。

你看过icu4j的Normalizer了吗?

normalize将Unicode文本转换为等效的合成或分解forms,从而可以更轻松地对文本进行排序和搜索。 normalize支持Unicode标准附件#15 – Unicode规范化表单中描述的标准规范化表单 。