2010-10-25 237 views
2

我在写一个C程序来搜索数据库中的大量UTF-8字符串。其中一些字符串包含教学法的英文字符,如重音符号等。搜索字符串由用户输入,因此它很可能不包含这些字符。有没有一种方法(函数,库等)可以从字符串中删除这些字符,或者只是执行一个教学不敏感的搜索?例如,如果用户输入搜索字符串“motor”,它应该匹配字符串“moto ̈ rhead”。从C中的UTF8字符串中删除变音符号

我第一次尝试是手工剥离出这里所描述的结合教学修饰符:

http://en.wikipedia.org/wiki/Combining_character

这个工作在某些情况下,但事实证明,许多这些字符也有特定的Unicode值。例如,上面的字符“o ̈”可以用一个“o”表示,然后是组合教学U + 0308,但它也可以用单个Unicode字符U + 00F6表示,而我的方法只能过滤前者。

我也看过iconv,它可以从UTF8转换为ASCII。但是,我可能希望将来的日期本地化我的程序,这无疑会导致非英文字符的语言出现问题。有没有一种方法可以简单地去掉/转换这些重音字符?

编辑:删除问题标题中的错字。

+0

你可能是指* diacritics * http://en.wikipedia.org/wiki/Diacritic不*教学法*? – kriss 2010-10-25 15:04:51

+0

这是一个教学评论。 – 2010-10-25 15:07:37

+0

每个人都需要学习有时... – kriss 2010-10-25 15:09:36

回答

4

转换为one of the decomposed normalizations - 可能是NFD,但你可能想要NFKD - 这会使所有的变音符合并成可以被剥离的字符。

你会想要一个这样的图书馆。我听到有关ICU的好消息。

1

使用ICU,在PRIMARY(L1)(仅使用基本字母,只关心'o'并忽略'ö')强度的“root”上创建collactor,然后您可以使用ICU的搜索功能进行匹配。有一个新的功能search collator,将提供专门为这种情况设计的校正器,但“主要优势”将处理这个特定情况。例如:"motor == mötor" in the 'collated' section