3

英語とギリシャ文字で同じ char 配列を定義しました。

char myText[]="ΗΤΙΑ ΗΤΙΑΑΑ ΛΟΥΛΟΥΔΙΑΣΜΕΝΗ!!!1234567890";
//  char myText[]="HTIA HTIAAA LOULOUDIASMENH!!!1234567890";

char 配列の長さを印刷すると、strlen(myText);ギリシャ語 UTF8 文字を含む最初のものは 63 文字の長さですが、2 番目のものは 39 文字です。これはなぜですか? 誰がこれを修正できますか、または適切な質問は、プログラムがギリシャ文字を正しく理解できるようにギリシャ文字を構文化する方法です?

文字配列を led マトリックスに送信すると、文字が英語の場合のようにメッセージが画面に表示されません。ギリシャ文字や非 ASCII 文字は 1 バイトより大きいようです。

文字をチェックし、文字ごとに適切なバイト配列を返すスイッチ関数があります。スイッチのデフォルトのケースを文字に設定しまし! た。したがって、私のスイッチはギリシャ文字を 1 バイト以上として理解し、最初にデフォルトのケース witch を返し、次に正しい文字を返します。HTIA HTIA!H!T!I!A!!

また、テキストを印刷しようとすると、シリアル モニタにエラーが表示されます (文字が正しく表示されません)。

4

2 に答える 2

0

UTF-8 は可変長エンコーディングであるため、1 バイトしか使用しない文字もあれば、数バイト使用する文字もあります。

ステートメントを使用して文字列を文字単位で処理している場合は、switch代わりにワイド文字列を使用する必要があります。

#include <stddef.h>

wchar_t myText[]= L"ΗΤΙΑ ΗΤΙΑΑΑ ΛΟΥΛΟΥΔΙΑΣΜΕΝΗ!!!1234567890";

ワイド文字は のwchar_t代わりに型を持ちchar、現在のロケールで任意の 1 文字を格納するのに十分な大きさを意図しています。ワイド文字列定数には、L文字がプレフィックスとして付きます。

switchステートメントでは、case 式でワイド文字定数を使用できます (これにも文字のプレフィックスが付いていますL)。

switch (c)
{
    case L'Λ':
    /* handle capital lambda */
    break;

    case L'Α':
    /* handle capital A */
    break;

    /* ... */
}
于 2013-08-13T00:54:20.550 に答える