タイトルが示すように、ユーザーが CEdit コントロールに入力したデータをファイルに書き込もうとしています。
システムは Windows CE を実行しているハンドヘルド ターミナルで、テスト アプリケーションが実行されています。テスト データ (ローマ字、ひらがな、カタカナ、漢字の日本語文字と通常の英数字データが混在) を入力しようとしましたが、最初はCListCtrl. テスト アプリケーション UI のハンドヘルド ディスプレイ画面に文字が正しく表示されます。最後に、リスト コントロールからデータを読み戻して、テキスト CSV ファイルに書き込もうとします。コントロールから読み取ったデータは正しいのですが、それを CSV に書き込むと、データがめちゃくちゃになり、CSV ファイルが読み取れなくなり、奇妙な記号や無意味な英数字のゴミが表示されます。
これについて検索したところ、stackOverflow で同様の質問がありました: UTF-8, CString and CFile? (C++、MFC)
彼らの提案をいくつか試してみたところ、最終的に適切な UTF-8 CSV ファイルにたどり着きました。
csv ファイルへの書き込みコードは次のようになります。
CStdioFile cCsvFile = CStdioFile();
cCsvFile.Open(cFileName, CFile::modeCreate|CFile::modeWrite);
char BOM[3]={0xEF, 0xBB, 0xBF}; // Utf-8 BOM
cCsvFile.Write(BOM,3); // Write the BOM first
for(int i = 0; i < M_cDataList.GetItemCount(); i++)
{
CString cDataStr = _T("\"") + M_cDataList.GetItemText(i, 0) + _T("\",");
cDataStr += _T("\"") + M_cDataList.GetItemText(i, 1) + _T("\",");
cDataStr += _T("\"") + M_cDataList.GetItemText(i, 2) + _T("\"\r\n");
CT2CA outputString(cDataStr, CP_UTF8);
cCsvFile.Write(outputString, ::strlen(outputString));
}
cCsvFile.Close();
これまでのところ問題ありません。ここで、私のユース ケースでは、CSV ファイルが UTF-8 ではなく Shift-JIS としてエンコードされるように少し変更したいと思います。Shift-JIS の場合、どの BOM を使用し、上記のコードにどのような変更を加える必要がありますか?
提案と助けをありがとう。