【问题标题】:Convert Latin Unicode characters stored in database to their English alphabet equivalents将存储在数据库中的拉丁 Unicode 字符转换为对应的英文字母
【发布时间】:2013-11-16 13:48:38
【问题描述】:

我正在创建一个搜索实用程序,它将搜索 SQLITE DB 中的元素,唯一的问题是,该 DB 包含一些字符,如 Å è ô,它们是拉丁语......

有没有一种简单的方法可以忽略这些字母并将它们视为英文字母对应物(Å = A,è = e ...)?

我想设计所有此类字符的一对一映射,例如,

    HashMap<Character, Character> lstOfChar = new HashMap<Character, Character>();
    lstOfChar.put('Å', 'A');
    lstOfChar.put('è', 'e');

当从数据库中检索数据时,每个这样的字符都将被替换为等效的英文字母,并显示搜索结果。

如果我正在搜索 Deepak,则应搜索包含 DeepÅkDÈepakdeepÃk 的行

但这将是一个漫长的过程,维护也很困难。

是否有一些优雅的方式,可能是 SQLITE 提供了一些功能,或者可以通过SQL
我正在使用Java 平台。

编辑我发现Normalizer in posted answer 确实有助于在获取结果后以编程方式执行此操作,但这可以通过database 或通过以某种特殊方式触发SQL 来完成,如获取结果并应用此函数并返回结果需要大量时间。

【问题讨论】:

  • 为什么要去掉非ASCII字符?如果您将它们替换,您还可能会更改单词的含义。
  • 我没有更改数据库中的实际值,而是获取结果然后在 UI 上显示它们,我只想搜索
  • 也许整理者可以提供帮助:docs.oracle.com/javase/7/docs/api/java/text/Collator.html

标签: java sqlite unicode


【解决方案1】:

您正在寻找Normalizer。它允许您在重音 Unicode 字符及其分解之间进行映射:

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

我建议您事先这样做,因为它很昂贵,然后将其放入“name_search”列或类似的内容中。值得注意的是,这不会捕获所有非“英文”字母,因为它们并不总是有分解,但会匹配 é 和 Â 等基本字母。

关于您的编辑:正如我所说,最好的方法是对所有行应用一次转换,然后将结果放入名为“name_search”的附加数据库列中相似的。这类似于在表上创建索引。 SQL 中没有等同于 Normalizer 的功能,虽然某些 RDBMS 系统可能会提供,但 SQLite 肯定没有。

【讨论】:

  • 它有所帮助,但我很想知道这是否会将所有 Unicode 字符 en.wikipedia.org/wiki/List_of_Unicode_characters 更改为英文等效
  • 没有。只有 具有 分解的 Unicode 字符才会被分解。如果字符不包含基本字母和变音符号,则无法将其转换为“英语”等价物,因为 没有 英文等价物。事实上,有数千个字符由不同字母表的字符加上该语言的组合变音符号组成。
  • 这意味着在插入每个条目时,我应该再添加一个与之关联的可搜索值,首先,我不允许更改数据库。其次,我已经拥有包含数百万条记录的大型数据库。第三,我不想添加新列。还有其他选择吗??????
  • 使用 SQLite 时唯一的选择是预先计算搜索或忍受它非常慢。 (但无论如何,拥有大型数据库的 SQLite 让我感到害怕。)
  • 这意味着,将标准化映射到所有数据并存储结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多