とりわけ、さまざまなエンコーディングのさまざまな文字列を含むファイルを解析しています。これらの文字列の保存方法は次のとおりです。
0xFF 0xFF - block header 2 bytes
0xXX 0xXX - length in bytes 2 bytes
0xXX - encoding (can be 0, 1, 2, 3) 1 byte
... - actual string num bytes per length
これは一般的に非常に簡単ですが、エンコーディングの扱い方がわかりません。エンコーディングは次のいずれかです。
0x00 - regular ascii string (that is, actual bytes represent char*)
0x01 - utf-16 with BOM (wchar_t* with the first two bytes being 0xFF 0xFE or 0xFE 0xFF)
0x02 - utf-16 without BOM (wchar_t* directly)
0x03 - utf-8 encoded string (char* to utf-8 strings)
これを何らかの方法で読み取り/保存する必要があります。最初はシンプルに考えていましstring
たが、それではうまくいきませんwchar_t*
。次に、すべてを に変換することを考えましたがwstring
、これはかなり不要な変換です。次に頭に浮かんだのはboost::variant<string, wstring>
(私はすでにboost::variant
コードの別の場所で使用しています)。これは私には合理的な選択のように思えます。だから今、私はそれを解析することに少しこだわっています。私はこれらの線に沿ってどこかで考えています:
//after reading the bytes, I have these:
int length;
char encoding;
char* bytes;
boost::variant<string, wstring> value;
switch(encoding) {
case 0x00:
case 0x03:
value = string(bytes, length);
break;
case 0x01:
value = wstring(??);
//how do I use BOM in creating the wstring?
break;
case 0x02:
value = wstring(bytes, length >> 1);
break;
default:
throw ERROR_INVALID_STRING_ENCODING;
}
これらの文字列を後で出力するだけなので、UTF8 を簡単に保存できstring
ます。
私が持っている2つの質問は次のとおりです。
そのようなアプローチは合理的なものですか (つまり、boost::variant を使用します)?
wstring
特定の BOM を使用して作成するにはどうすればよいですか?