我正在编写一个C程序来搜索数据库中的大量UTF-8字符串。其中一些字符串包含带有教学法的英语字符,例如重音等。搜索字符串由用户输入,因此很可能不包含此类字符。有没有一种方法(函数,库等)可以从字符串中删除这些字符,或只是执行一个教学不敏感的搜索?例如,如果用户输入搜索字符串“motor”,则它应匹配字符串“motörhead”。
我的第一次尝试是手动去除这里描述的组合教学修饰符:
http://en.wikipedia.org/wiki/Combining_character
这在某些情况下有效,但事实证明这些字符中的许多也具有特定的unicode值。例如,上面的字符“ö”可以用“o”表示,然后是组合教学U + 0308,但它也可以用单个unicode字符U + 00F6表示,我的方法只过滤前者。
我也研究过iconv,它可以从UTF8转换为ASCII。但是,我可能希望在将来的日期本地化我的程序,这无疑会导致非英语字符语言出现问题。有没有办法可以简单地剥离/转换这些重音字符?
编辑:删除问题标题中的拼写错误。
答案 0 :(得分:4)
转换为one of the decomposed normalizations - 可能是NFD,但您可能希望NFKD均匀 - 这会使所有变音符号组合成可以被剥离的字符。
你需要一个库。我听到有关ICU的好消息。
答案 1 :(得分:1)
使用ICU,使用PRIMARY(L1)(只使用基本字母,只关心'o'并忽略'ö')的“root”创建一个collator,然后你可以使用ICU的搜索功能匹配。有一个新功能search collator将为这种情况提供专门的合作者,但“主要力量”将处理这种特定情况。