Visual C++ 6.0というか、MFC4.2ネタとも言えますが、はまって時間を無駄にする人を増やしたくないので、記事にしておきます。
MFC4.2のCStringにBOM(Byte Order Mark)付きのUTF-8文字列を代入するとなぜかワイド文字用のコンストラクタが起動されてしまい、正常に文字列を格納することができません。このため、CStringにUTF-8文字列を代入するときは、BOMを削除して代入する必要があります。
// 代入したいUTF-8の文字列データがpszUTF8で参照できると仮定して、
// 先頭にBOMがあるかどうかを判定する
LPSTR pszUTF8noBOM = NULL;
if ( (unsigned char)pszUTF8[0] == 0xEF &&
(unsigned char)pszUTF8[1] == 0xBB &&
(unsigned char)pszUTF8[2] == 0xBF ) {
pszUTF8noBOM = pszUTF8 + 3;
}
else {
pszUTF8noBOM = pszUTF8;
}
// UTF-8文字列をBOM無しの状態でCStringに格納します
CString utf8Buffer = pszUTF8noBOM;
こうすることで、MFC4.2のCStringにUTF-8文字列を代入できます。
別の記事で、UTF-8文字列が入っているファイルをMBCS文字列に変換するフィルターを紹介します。