1

タイトルが示すように、ユーザーが 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 を使用し、上記のコードにどのような変更を加える必要がありますか?

提案と助けをありがとう。

4

1 に答える 1