私たちは、アプリケーションをUnicode対応にすることを計画しており、発生する問題を分析しています。
wchar_t
特に、私たちのアプリケーションは、たとえば文字列の長さに大きく依存するため、基本文字クラスとして使用したいと思います。
この問題は、UTF-16で16ビットの2単位で格納する必要のある文字、つまりU+10000を超える文字を処理するときに発生します。
簡単な例:
UTF-8文字列"蟂"(Unicode文字U + 87C2、UTF-8:E8 9F 82)があります
そこで、次のコードを設定します。
const unsigned char my_utf8_string[] = { 0xe8, 0x9f, 0x82, 0x00 };
// compute size of wchar_t buffer.
int nb_chars = ::MultiByteToWideChar(CP_UTF8, // input is UTF8
0, // no flags
reinterpret_cast<char *>(my_utf8_string), // input string (no worries about signedness)
-1, // input is zero-terminated
NULL, // no output this time
0); // need the necessary buffer size
// allocate
wchar_t *my_utf16_string = new wchar_t[nb_chars];
// convert
nb_chars = ::MultiByteToWideChar(CP_UTF8,
0,
reinterpret_cast<char *>(my_utf8_string),
-1,
my_widechar_string, // output buffer
nb_chars); // allocated size
さて、これは機能し、16ビットを2回割り当て、のバッファにwchar_t
は{0x87c2、0x0000}が含まれています。それをaの中に保存しstd::wstring
てサイズを計算すると、1になります。
ここで、UTF-8:F0 90 92 A2の入力として文字(U + 104A2)を使用します。
今回は、3つのwchar_tにスペースを割り当て、std :: wstring :: sizeは、文字が1つしかないことを考慮しても、 2を返します。
これには問題があります。UTF-8でデータを受信すると仮定します。に等しいバイトをカウントしないだけで、Unicode文字をカウントできます10xxxxxx
。そのデータを配列にインポートして処理したいと思いwchar_t
ます。文字数に1を足した数を割り当てるだけなら、安全かもしれません...誰かがU+FFFFより上の文字を使用するまで。そして、バッファが短すぎて、アプリケーションがクラッシュします。
それで、同じ文字列で、異なる方法でエンコードされた場合、文字列内の文字をカウントする関数は異なる値を返しますか?
この種の煩わしさを回避するために、Unicode文字列で動作するアプリケーションはどのように設計されていますか?
返信ありがとうございます。