Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 删除给定文本中的字母重音符号_C_Character Encoding_Ascii_Non Ascii Characters - Fatal编程技术网

C 删除给定文本中的字母重音符号

C 删除给定文本中的字母重音符号,c,character-encoding,ascii,non-ascii-characters,C,Character Encoding,Ascii,Non Ascii Characters,也许我遗漏了一些明显的东西,但是有没有一种“无痛”的方法来用不带重音的字母替换给定文本中带重音的字母呢?我只能使用标准的ANSIC库/头,因此我束手无策。到目前为止,我所尝试的: unsigned char currentChar; (...) if (currentChar == 'à') { currentChar = 'a'; } else if (currentChar == 'è' || currentChar == 'é') { currentChar = '

也许我遗漏了一些明显的东西,但是有没有一种“无痛”的方法来用不带重音的字母替换给定文本中带重音的字母呢?我只能使用标准的ANSIC库/头,因此我束手无策。到目前为止,我所尝试的:

unsigned char currentChar;

(...)

if (currentChar == 'à') { 
    currentChar = 'a'; 
}
else if (currentChar == 'è' || currentChar == 'é') {
    currentChar = 'e'; 
}
else if (...)
然而,这不起作用。检测带有扩展ASCII值的重音元音也不是一个选项,因为我注意到它随系统语言环境的变化而变化

有什么提示/建议吗

(更新)

谢谢你的回答,但我并不是真的在问解决这个问题的最佳方法——我稍后会考虑。我只是想找到一种检测重音元音的方法,因为上面的代码忽略了它们

(更新#2)

好的。让我澄清一下:

#include <stdio.h>

int main(void) {
    int i;
    char vowels[6] = {'à','è','é','ì','ò','ù'};
    for (i = 0; i < 6; i++) {
        switch (vowels[i]) {
            case 'à': vowels[i] = 'a'; break;
            case 'è': vowels[i] = 'e'; break;
            case 'é': vowels[i] = 'e'; break;
            case 'ì': vowels[i] = 'i'; break;
            case 'ò': vowels[i] = 'o'; break;
            case 'ù': vowels[i] = 'u'; break;
        }
     }
     printf("\n");
     for (i = 0; i < 6; i++) {
         printf("%c",vowels[i]);
     }
     printf("\n");
     return 0;
}
#包括
内部主(空){
int i;
字符元音[6]={'a','è','e','ì','ò','ù'};
对于(i=0;i<6;i++){
切换(元音[i]){
格“a”:元音[i]=“a”;中断;
格“è”:元音[i]=“e”;断开;
格“é”:元音[i]=“e”;break;
格“ì”:元音[i]=“i”;break;
格“ò”:元音[i]=“o”;break;
格“ù”:元音[i]=“u”;break;
}
}
printf(“\n”);
对于(i=0;i<6;i++){
printf(“%c”,元音[i]);
}
printf(“\n”);
返回0;
}

这段代码仍然打印“áèìù”作为其输出。这是我的问题。我很欣赏这些答案,但是告诉我实现转换映射或开关/案例结构是毫无意义的。我以后再考虑。

可能有一种更简单的方法,一些我没听说过的现有功能,但就结构而言,我会这样做:


构建由重音字符和结果字符组成的字符转换表。然后构建一个简单的循环来扫描表中的每个字符,如果找到,进行更改。

重音字符可能是UTF-8字符集的一部分,或者是其他编码。您的程序使用的是
char
类型,它通常使用

在ASCII字符集中,每个字符由一个字节表示。此字符集不包括重音字符

其他编码确实包含该字符,但它可能不是由单个字节表示的,因此无法由代码处理。解决方法通常是使用宽字符

你需要的是

梅有更一般的解释

可以为您的案例提供解决方案

此代码似乎执行了您希望执行的操作:

#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc, char **argv){
    setlocale(LC_CTYPE, "");
    FILE *f = fopen(argv[1], "r");
    if (!f)
        return 1;

    for (wchar_t c; (c = fgetwc(f)) != WEOF;){
        switch (c) {
            case L'à': c=L'a'; break;
            case L'è': c=L'e';break;
            case L'é': c=L'e';break;
            case L'ì': c=L'i';break;
            case L'ò': c=L'o';break;
            case L'ù': c=L'u';break;
            default:    break;
        }
        wprintf(L"%lc", c);
    }

    fclose(f);
    return 0;
}
#包括
#包括
#包括
int main(int argc,字符**argv){
setlocale(LC_CTYPE,“”);
文件*f=fopen(argv[1],“r”);
如果(!f)
返回1;
对于(wchar_t c;(c=fgetwc(f))!=WEOF;){
开关(c){
案例L‘a’:c=L‘a’;中断;
案例Lè:c=Lè;中断;
案例L'e':c=L'e';break;
案例L‘ì’:c=L‘i’;中断;
案例L‘ò’:c=L‘o’;中断;
案例L‘ù’:c=L‘u’;中断;
默认:中断;
}
wprintf(L“%lc”,c);
}
fclose(f);
返回0;
}
如果您编写

if ( currentChar == (unsigned char)('è'))...
考虑到您仅使用std c库的限制,您的方法应该有效。我不知道您如何才能实现它。

让我们试试这个方法:

char p_RemoveAccent(char C)
{
    #define ACCENT_CHARS    "ÁÀÃÂÇáàãâçÉÊéêÍíÑÓÔÕñóôõÚÜúü"
    #define UNACCENT_CHARS  "AAAACaaaacEEeeIiNOOOnoooUUuu"

    const char *p_Char = memchr(ACCENT_CHARS, C, sizeof(ACCENT_CHARS));

    return (p_Char ? UNACCENT_CHARS[(p_Char - ACCENT_CHARS)] : C);
}

虽然可能不是您问题的解决方案,但我至少会使用
switch
而不是
if…else if
语句。ANSI C对您有什么好处?另外,ANSI与ISO标准委员会就C的修订保持同步,目前的修订版本为C11。你是说那个还是C89?南希,你是怎么编译的?当我编译你的代码时,我得到了很多“警告:多字符字符常量”-也就是说,你的重音字符不是单一的chars@WilliamMorris:很好的观察,源代码编码可能是UTF-8,但编译器不支持UTF-8,并将字符视为多字节“字符”常量(与字符不相等).好吧,但我遇到的问题是-重音元音根本无法识别。我知道isalpha()不能处理它们,所以我实施了一些显式检查,但它们似乎无法检测元音本身。我建议的结构不需要
isalpha()
或任何其他CRT代码。请再次阅读我的建议,如果有您不理解的部分,请告诉我。@NancyB.:是的,
是*()
来自
ctype.h
不处理它们。。您可以查看“wchar.h”例程。这可能会起作用,但这只是因为重音字符由两个字节组成,而强制转换是告诉编译器使用其中一个字节)。因此,在我的系统中,‘a’由0xC3表示,0xA0,‘è’由0xC3、0xA8等表示。强制转换告诉
if
只查看值0xA8。此外,解决方案可能会在具有相反端点的计算机上失败。@NancyB.,我发布了一段代码,似乎可以实现您想要的功能。我刚刚做了一个快速更正,使其读取
wprintf(L“%c”,c)。我已经测试过了,它对我很有效。用这种方法溢出很好,但OP清楚地说明了“我并不是真的在寻求解决这个问题的最佳方法——我以后会考虑。我只是在寻求一种检测重音元音的方法。”--OPs源代码正在隐藏它们。由于重音字符超过1字节,因此无法工作,因此
非重音字符[(p\u Char-重音字符)]
将命中错误的非重音字符