C - 如何避免变音/重音敏感问题

时间:2016-07-17 21:02:42

标签: c diacritics wchar

我正在创建一个猜测国家首都的小程序。一些首都有口音,cedillas等。

由于我必须比较用户猜测的资本和文本,而且我不想让口音弄乱这些比较,我去挖掘互联网以获得某种方式。

我遇到了无数其他编程语言的解决方案,但只有几个关于C的结果。

他们都没有真正和我合作过。虽然,我得出结论,我必须使用wchar.h库来处理那些讨厌的字符

我制作了这一小段代码(用E代替É)只是为了检查这个方法而且反对我阅读并理解它不起作用,即使打印宽字符串也不显示变音字符。如果它有效,我相信我可以在首都的计划中实现这一点,所以如果有人能告诉我什么是错的,我会很感激。

#include<stdio.h>
#include<locale.h>
#include<wchar.h>

const wchar_t CAPITAL_ACCUTE_E = L'\u00C9';

int main()
{
    wchar_t wbuff[128];
    setlocale(LC_ALL,"");
    fputws(L"Say something: ", stdout);
    fgetws(wbuff, 128, stdin);
    int n;
    int len = wcslen(wbuff);
    for(n=0;n<len;n++)
        if(wbuff[n] == CAPITAL_ACCUTE_E)
            wbuff[n] = L'E';
    wprintf(L"%ls\n", wbuff);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您忽略的一个问题是É可以表示为

您需要考虑到这一点。这可以通过将两个字符串映射到NFD (Normal Form: Decomposed)来完成。之后,您可以删除已分解的组合字符,并保留E,然后您可以照常strcmp

假设您有一个UTF-8编码的input,您可以使用utf8proc执行此操作:

#include <utf8proc.h>

utf8_t *output;
ssize_t len = utf8proc_map((uint8_t*)input, 0, &output, 
                           UTF8PROC_NULLTERM | UTF8PROC_STABLE |
                           UTF8PROC_STRIPMARK | UTF8PROC_DECOMPOSE |
                           UTF8PROC_CASEFOLD
                          );

这会将所有ÉÉE变为普通e