Visual Studio 2005以降でUNICODEテキストファイルを扱うときのコツ

Visual Studio 2005以降でUNICODE/UTF-8/UTF-16LEで保存されたテキストを読み込もうとするとアスキーコードの上位バイトを空文字'\0'として読み込んでしまったりしてうまくいかないときがある。これを防ぐためにはfopen()の引数として渡す文字列に追加オプションを入れるとよい。

FILE* file = fopen("hoge.txt", "rt, ccs=UNICODE");

ifstreamを使用するときはこんな感じ

FILE* file = fopen("hoge.txt", "rt, ccs=UNICODE");
ifstream ifs(file);

なお、MSDNライブラリにはこのように書かれている。

Visual C++ 2005 では、fopen は Unicode のファイル ストリームをサポートします。
必要なエンコーディングを指定するフラグは、新しいファイルを開いたり既存のファイルを上書きしたりすると、次のように fopen に渡されることがあります。

fopen("newfile.txt", "rw, ccs=<encoding>"); 

encoding に指定できる値には、UNICODE、UTF-8、および UTF16-LE があります。
ファイルが既に存在し、読み取り用または追加用に開かれる場合、バイト順マーク (BOM: Byte Order Mark) を使用して適切なエンコーディングが決定されます。
フラグでエンコーディングを指定する必要はありません。実際、BOM で示されたようにフラグがファイルの種類と競合する場合、このフラグは無視されます。
フラグは、BOM が表示されていない場合またはファイルが新しいファイルの場合のみ使用されます。

これを知る前はテキストファイルをバイナリとして読み込んだ後にwchar_t*に渡してwstringに渡したりしていた。あの時これを知っていれば・・・。