4

如何在 Java 中规范化/非重音文本?我目前正在使用 java.text.Normalizer:

Normalizer.normalize(str, Normalizer.Form.NFD)
    .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")

但它远非完美。例如,它使挪威字符 æ 和 ø 保持不变。有谁知道替代方案?我正在寻找可以将各种语言中的字符转换为 az 范围的东西。我意识到有不同的方法可以做到这一点(例如应该将æ编码为'a','e'甚至'ae'?)并且我愿意接受任何解决方案。我宁愿自己不写东西,因为我认为我不太可能在所有语言中都能做到这一点。性能并不重要。

用例:我想将用户输入的名称转换为纯 az 范围名称。转换后的名称将显示给用户,所以我希望它尽可能接近用户用他的原始语言写的内容。

编辑:

好的人们,谢谢你否定了这个帖子而不是解决我的问题,耶!:) 也许我应该忽略用例。但请允许我澄清一下。我需要转换名称以便在内部存储它。我无法控制此处允许的字母选择。该名称将在例如 URL 中对用户可见。与您在此论坛上的用户名标准化并在您单击您的姓名时在 URL 中显示给您的方式相同。该论坛将“Băşan”之类的名称转换为“baan”,将“Øyvind”之类的名称转换为“yvind”。我相信它可以做得更好。我正在寻找想法,最好是一个库函数来为我做这件事。我知道我做错了,我知道“o”和“ø”是不同的,等等,但是如果我的名字是“Øyvind”并且我在在线论坛上注册,我可能更喜欢我的用户名是“ oyvind”而不是“yvind”。希望这有任何意义!谢谢!

(不,我们不允许用户选择他自己的用户名。我真的只是在寻找 java.text.Normalizer 的替代品。谢谢!)

4

1 回答 1

2

假设你已经考虑了你正在做的事情的所有影响,所有可能出错的方式,当你得到中国象形图和其他拉丁字母表中没有的东西时你会做什么......

据我所知,没有一个图书馆可以满足您的要求。如果你有一个等价物列表(如你所说,'æ' 到 'ae' 或其他),你可以将它们存储在一个文件中(或者,如果你经常这样做,在内存中的排序数组中,出于性能原因),然后进行查找并按字符替换。如果您有内存空间将(unicode 字符数)存储为 char 数组,那么能够遍历每个字符的 unicode 值并进行直接查找将是最有效的。

即 /u1234 => lookupArray[1234] => 'q'

管他呢。

所以你会有一个看起来像这样的循环:

StringBuffer buf = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
  buf.append(lookupArray[Character.unicodeValue(string.charAt(i))]);
}

我是从头开始写的,所以可能有一些不好的方法调用之类的。

您必须做一些事情来处理分解的字符,可能使用前瞻缓冲区。

祝你好运——我敢肯定这充满了陷阱。

于 2011-11-08T02:46:00.813 回答