C-从给定文本中删除字母的口音



也许我错过了一些明显的东西,但是是否有一种"无痛"的方式来替换给定文本中的重音字母,并用他们的含糊不清?我只能使用标准的ANSI C库/标头,因此我的手被绑住了。到目前为止,我尝试了什么:

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;
}

此代码仍将"àèéìò则"打印为输出。这是我的问题。我感谢答案,但是告诉我实现转换图或开关/案例结构是毫无意义的。我会考虑一下以后

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

在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;
}

可能有一种更简单的方法,我没有听说过的某些现有功能,但是就结构而言,这就是我的处理方式:

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

如果您写

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);
}

相关内容

  • 没有找到相关文章

最新更新