3

明らかな何かが欠けているかもしれませんが、特定のテキストのアクセント付き文字をアクセントなしの対応する文字に置き換える「痛みのない」方法はありますか?標準の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;
}

このコードは、出力として「àèéìòù」を出力します。これが私の問題です。回答に感謝しますが、変換マップ、またはスイッチ/ケース構造を実装するように指示するのは無意味です。後で考えます。

4

4 に答える 4

3

アクセント付き文字は、UTF-8文字セットまたはその他のエンコーディングの一部である可能性があります。プログラムはcharタイプを使用しており、通常はASCII文字セットを使用します。

ASCII文字セットでは、各文字は1バイトで表されます。この文字セットには発音区別符号は含まれていません。

他のエンコーディングには文字が含まれていますが、おそらく1バイトで表されていないため、コードで処理できません。これに対する解決策は、通常、ワイド文字を使用することです。

必要なのはワイド文字です。

この質問には、より一般的な説明があるかもしれません。

この質問はあなたのケースの解決策を提供するかもしれません。

このコードはあなたが望むことをしているようです:

#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;
}
于 2012-11-05T19:11:22.307 に答える
1

もっと簡単な方法があるかもしれません、私が聞いたことがないいくつかの既存の機能ですが、構造に関しては、これは私がそれにアプローチする方法です:

発音区別符号と結果の文字で構成される文字変換のテーブルを作成します。次に、単純なループを作成して各文字のテーブルをスキャンし、見つかった場合は変更を加えます。

于 2012-11-05T18:53:45.857 に答える
1

あなたが書くなら

if ( currentChar == (unsigned char)('è'))...

std cライブラリのみを使用するという制約がある場合、あなたのアプローチは機能するはずです。

于 2012-11-05T19:13:38.233 に答える
1

これを試してみましょう:

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);
}
于 2016-04-04T18:00:48.957 に答える