「äa」のような文字配列があるとしましょう。マルチバイトである最初の文字の ascii 値 (たとえば 228) を取得する方法はありますか? 配列を wchar_t * 配列にキャストしても、「ä」の ascii 値を取得できません。2 バイトの長さです。これを行う方法はありますか、私は今2日間試しています:(
私はgccを使用しています。
ありがとう!
char 配列で使用されるエンコーディングに依存します。
char 配列が Latin 1 でエンコードされている場合、その長さは 2 バイト (さらに NUL ターミネータが含まれている可能性がありますが、気にしません) であり、これらの 2 バイトは次のとおりです。
Latin 1 は ASCII ではなく、0xE4 は ASCII 値ではなく、Latin 1 (または Unicode) 値であることに注意してください。
次のような値を取得します。
int i = (unsigned char) my_array[0];
char 配列が UTF-8 でエンコードされている場合、長さは 3 バイトで、それらのバイトは次のとおりです。
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だと動かない…
その変換を行う標準の C++ テンプレート関数ctype::narrow()があります。ローカリゼーション ライブラリの一部です。可能であれば、ワイド文字を現在のローカルの同等の char 値に変換します。他の回答が指摘しているように、常にマッピングがあるとは限りません。そのため、マッピングがない場合に ctype::narrow() が返すデフォルト文字を使用します。