从C中的UTF8字符串中删除变音符号

从C中的UTF8字符串中删除变音符号,c,utf-8,C,Utf 8,我正在编写一个C程序来搜索数据库中大量的UTF-8字符串。其中一些字符串包含带教学法的英语字符,如重音等。搜索字符串由用户输入,因此很可能不包含此类字符。有没有一种方法(函数、库等)可以从字符串中删除这些字符,或者只是执行说教式的不敏感搜索?例如,如果用户输入搜索字符串“motor”,则应与字符串“motỏrhead”匹配 我的第一次尝试是手动去除此处描述的组合说教修饰语: 这在某些情况下是有效的,但事实证明,这些字符中的许多也有特定的unicode值。例如,上面的字符“ỏ”可以用“o”表

我正在编写一个C程序来搜索数据库中大量的UTF-8字符串。其中一些字符串包含带教学法的英语字符,如重音等。搜索字符串由用户输入,因此很可能不包含此类字符。有没有一种方法(函数、库等)可以从字符串中删除这些字符,或者只是执行说教式的不敏感搜索?例如,如果用户输入搜索字符串“motor”,则应与字符串“motỏrhead”匹配

我的第一次尝试是手动去除此处描述的组合说教修饰语:

这在某些情况下是有效的,但事实证明,这些字符中的许多也有特定的unicode值。例如,上面的字符“ỏ”可以用“o”表示,后跟组合式说教U+0308,但也可以用单个unicode字符U+00F6表示,我的方法仅过滤前者

我还研究了iconv,它可以从UTF8转换为ASCII。然而,我可能想在将来本地化我的程序,这无疑会给非英语字符的语言带来问题。有没有一种方法可以简单地去除/转换这些重音字符

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

转换为——可能是NFD,但您可能需要NFKD——这使得所有的变音符号都可以组合成可以剥离的字符

你需要一个图书馆。我听到了一些好消息。

使用,在“根”上创建一个具有主字母(L1)强度的排序符(只使用基本字母,只关心“o”而忽略“ö”),然后您可以使用ICU的搜索功能进行匹配。有一个新的功能,将提供特殊的衣领设计为这种情况下,但“主要力量”将处理这个特定的情况


示例:。

你可能是指发音学而不是教学法?每个人有时都要学习……你使用的是什么样的数据库?如果它是一个真正的数据库服务器(比如MySQL),它可能能够自己进行说教式的不敏感搜索。这很好,因为我计划进一步增强特定数据库软件可能不支持的功能。