我正在创建一个搜索实用程序,它将搜索SQLITE数据库中的元素。唯一的问题是,数据库包含一些字符,如Åèô,它们是拉丁文...
是否有一种简单的方法可以忽略这些字母并将它们视为英文字母对应部分(Å= A,è= e ...)?
我想过设计所有这些字符的1对1映射,比如
HashMap<Character, Character> lstOfChar = new HashMap<Character, Character>();
lstOfChar.put('Å', 'A');
lstOfChar.put('è', 'e');
当从数据库中检索数据时,每个这样的字符将被替换为等效的英文字母,并且将显示搜索结果。
如果我正在搜索
Deepak
,则应搜索包含DeepÅk
或DÈepak
或deepÃk
的行
但这将是漫长的过程和维护也将是艰难的。
是否有一些优雅的方式,可能是SQLITE提供某些功能,或者是否可以通过SQL
我正在使用Java
平台。
编辑我发现Normalizer in posted answer在获取结果后确实有助于编程,但这可以通过database
或通过触发SQL
完成以某种特殊方式,因为它需要大量时间来获取结果并应用此函数并返回结果。
答案 0 :(得分:5)
您正在寻找Normalizer
。它允许您在重音的Unicode字符及其分解之间进行映射:
Normalizer.normalize(text, Normalizer.Form.NFD).replaceAll(
"\\p{InCombiningDiacriticalMarks}+", "");
我建议你事先这样做,因为它很昂贵,并把它放在“name_search”专栏或类似的东西中。值得注意的是,这不会捕获所有非“英文”字母,因为它们并不总是有分解,但是é和Â等基础知识将会匹配。
关于您的编辑:正如我所说,最好的方法是将转换应用到所有行,并将结果放在名为“name_search”的其他数据库列中类似。它类似于在表上创建索引。在SQL中没有与Normalizer的功能相同的功能,虽然有些RDBMS系统可能提供一个,但SQLite肯定没有。