加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:17:03 所属栏目:百科 来源:网络整理
导读:我正在创建一个猜测国家首都的小程序.一些首都有口音,cedillas等. 由于我必须比较用户猜测的资本和文本,并且我不想让重点搞乱比较,我去挖掘互联网以实现某种方式. 我遇到了其他编程语言的无数解决方案,但只有几个关于C的结果. 他们都没有真正和我合作过.虽然
我正在创建一个猜测国家首都的小程序.一些首都有口音,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"%lsn",wbuff);
    return 0;
}

解决方法

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

>é – LATIN CAPITAL LETTER E WITH ACUTE,代码点U 00C9(UTF-8中的c3 89),或
>é – LATIN CAPITAL LETTER E,紧接着是COMBINING ACUTE ACCENT,代号为U 0045 U 0301(45 cc 81 in UTF-8)

你需要考虑到这一点.这可以通过将两个字符串映射到NFD (Normal Form: Decomposed)来完成.之后,您可以去除已分解的组合字符并留下E,然后您可以像往常一样进行strcmp.

假设你有一个UTF-8编码输入,你可以用utf8proc来做到这一点:

#include <utf8proc.h>

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

这将把所有的é,é和E变成平常的e.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读