0

「äa」のような文字配列があるとしましょう。マルチバイトである最初の文字の ascii 値 (たとえば 228) を取得する方法はありますか? 配列を wchar_t * 配列にキャストしても、「ä」の ascii 値を取得できません。2 バイトの長さです。これを行う方法はありますか、私は今2日間試しています:(

私はgccを使用しています。

ありがとう!

4

5 に答える 5

1

char 配列で使用されるエンコーディングに依存します。

char 配列が Latin 1 でエンコードされている場合、その長さは 2 バイト (さらに NUL ターミネータが含まれている可能性がありますが、気にしません) であり、これらの 2 バイトは次のとおりです。

  • 0xE4 (小文字のウムラウト)
  • 0x61 (小文字の a)。

Latin 1 は ASCII ではなく、0xE4 は ASCII 値ではなく、Latin 1 (または Unicode) 値であることに注意してください。

次のような値を取得します。

int i = (unsigned char) my_array[0];

char 配列が UTF-8 でエンコードされている場合、長さは 3 バイトで、それらのバイトは次のとおりです。

  • バイナリ 11000011 (UTF-8 でエンコードされた 0xE4 の最初のバイト)
  • バイナリ 10100100 (UTF-8 でエンコードされた 0xE4 の 2 番目のバイト)
  • 0x61 (小文字の a)

UTF-8 でエンコードされた文字の Unicode 値を復元するには、 http://en.wikipedia.org/wiki/UTF-8#Descriptionに基づいて自分で実装する必要があります(通常、製品コードでは悪い考えです)。または、プラットフォーム固有の unicode から wchar_t への変換ルーチンを使用する必要があります。Linux では、これはmbstowcsまたはですが、現在のロケールで定義されているマルチバイト エンコーディングが実際に UTF-8 であるiconv場合は、単一の文字を使用できます。mbtowc

wchar_t i;
if (mbtowc(&i, my_array, 3) == -1) {
    // handle error
}

SHIFT-JISだと動かない…

于 2010-03-05T12:58:06.027 に答える
1

その変換を行う標準の C++ テンプレート関数ctype::narrow()があります。ローカリゼーション ライブラリの一部です。可能であれば、ワイド文字を現在のローカルの同等の char 値に変換します。他の回答が指摘しているように、常にマッピングがあるとは限りません。そのため、マッピングがない場合に ctype::narrow() が返すデフォルト文字を使用します。

于 2010-03-05T12:59:55.590 に答える