WriteFileでUNICODEテキストをファイルに書き込む
Windows API の WriteFile() をつかってファイルにUNICODEテキストを書き込んだものをテキストエディタで見ると文字化けするので、どうしたものかと調べてみたら、BOMとやらを書き込んでなかったのが原因らしい。
・http://home.a03.itscom.net/tsuzu/programing/tips46.htm
つまり、UNICODEファイルには、先頭にエンディアンを示す 2byte の BOM [Byte Order Mark] を書き込まないといけないみたいなのです。
エンディアン | BOM |
---|---|
リトルエンディアン | 0xFF, 0xFE |
ビッグエンディアン | 0xFE, 0xFF |
常に追記でファイルを開く場合のコードは、以下のようになります。
// 存在したらそのファイルを開き、末尾に移動、存在しなければ作成してオープン. HANDLE hFile; // 存在したら追記、無ければ作成するファイルのハンドル. hFile = CreateFile( filename, // ファイル名. GENERIC_WRITE, // アクセスの種類. 0, // 共有. NULL, // 子プロセスへの継承設定. OPEN_ALWAYS, // 存在しない場合、作成. FILE_ATTRIBUTE_NORMAL, NULL ); ASSERT( (hFile != INVALID_HANDLE_VALUE), "オープン失敗\n" ); // ファイルの末尾に移動. DWORD filepointer = SetFilePointer( hFile, 0, NULL, FILE_END ); ASSERT( (filepointer != 0xFFFFFFFF), "オープン失敗2\n" ); if( filepointer == FILE_BEGIN ){ // 新しく開かれたファイルのとき. BOOL br; DWORD sizeWritten = 0; BYTE bom[2] = { 0xFF, 0xFE }; // リトルエンディアンのBOM. br = WriteFile( hFile, bom, (DWORD)(sizeof(bom)), &sizeWritten, 0 ); ASSERT( (br==TRUE), "BOM書き込み失敗.\n" ); }