如何用Java规范/取消重音文本?我目前正在使用java.text.Normalizer:
Normalizer.normalize(str, Normalizer.Form.NFD)
.replaceAll("\\p{InCombiningDiacriticalMarks}+", "")但它远非完美。例如,它使挪威的字符保持不变。有没有人知道另一种选择?我正在寻找的东西,将转换字符在各种语言,只有a范围。我意识到有不同的方法来做到这一点(例如,应该编码为'a','e‘,甚至'ae'?)我对任何解决方案都持开放态度。我不喜欢自己写东西,因为我认为我不太可能在所有语言中都能做到这一点。性能并不重要。
用例:我希望将用户输入的名称转换为普通的a远程名称。转换后的名称将显示给用户,因此我希望它尽可能接近用户用其原始语言编写的内容。
编辑:
好的,各位,谢谢你在邮件中没有回答我的问题,耶!:)也许我应该忽略用例。但请允许我澄清。我需要转换名称以便在内部存储它。我对这里允许的字母选择没有控制。这个名字对用户来说是可见的,例如在网址中。同样的方式,你的用户名在这个论坛上是标准化的,并显示在URL中,如果你点击你的名字。这个论坛将像"Bășan“这样的名称转换为"baan”,并将像"yvind“这样的名称转换为”yvind“。我相信可以做得更好。我正在寻找想法,最好是一个图书馆的功能,为我这样做。我知道我做得不对,我知道"o“和”o“是不同的,但是如果我的名字是"oyvind”,并且我在一个在线论坛上注册,我可能更希望我的用户名是“oyvind”,而不是"yvind“。希望这是有意义的!谢谢!
(不,我们将不允许用户选择自己的用户名。我真的只是在寻找java.text.Normalizer的替代方案。谢谢!)
发布于 2011-11-08 02:46:00
假设你已经考虑了你正在做的事情的所有含义,它可能出错的所有方式,当你得到中文象形文字和其他在拉丁文字母中没有对应的东西时你会做什么.
据我所知,没有一个图书馆能做你想要的。如果您有一个等价物列表(如您所说的“”到“ae”或其他什么),您可以将它们存储在文件中(或者,如果您经常这样做,则存储在内存中的排序数组中,因为性能原因),然后进行查找并按字符替换。如果您在内存中有空间将( unicode字符的#)存储为一个char数组,那么能够运行每个字符的unicode值并进行直接查找将是最有效的。
即,/u1234 => lookupArray1234 => 'q‘
或者别的什么。
因此,您将有一个循环,看起来如下:
StringBuffer buf = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
buf.append(lookupArray[Character.unicodeValue(string.charAt(i))]);
}我是从零开始写的,所以可能有一些错误的方法调用或什么的。
您将不得不做一些事情来处理分解的字符,可能需要一个前瞻性缓冲区。
祝你好运--我肯定这充满了陷阱。
https://stackoverflow.com/questions/8043935
复制相似问题