1

正如标题所说,我一直在尝试将用户输入 CEdit 控件的数据写入文件。

该系统是一个运行 Windows CE 的手持终端,在其中运行我的测试应用程序,我尝试输入最初显示在CListCtrl。字符在我的测试应用程序 UI 的手持显示屏上正确显示。最后,我尝试从 List 控件读回数据并将其写入文本 CSV 文件。我从控件读回的数据是正确的,但是在将其写入 CSV 时,事情变得一团糟,我的 CSV 文件不可读,并显示奇怪的符号和无意义的字母数字垃圾。

我对此进行了搜索,最后在 stackOverflow 上遇到了类似的问题: UTF-8、CString 和 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 文件编码为 Shift-JIS,而不是 UTF-8。对于 Shift-JIS,我应该使用什么 BOM,以及我应该对上述代码进行哪些更改?

感谢您的任何建议和帮助。

4

1 回答 1

1

WideCharToMultiByteShift-JIS的代码页显然是 932。MultiByteToWideChar用于转换。例如:

CStringW source = L"日本語ABC平仮名ABCひらがなABC片仮名ABCカタカナABC漢字ABC①";
CStringA destination = CW2A(source, 932);
CStringW convertBack = CA2W(destination, 932);

//Testing:
ASSERT(source == convertBack);
AfxMessageBox(convertBack);

据我所知,Shift-JIS 没有 BOM。也许您只想使用 UTF16。例如:

CStdioFile file;
file.Open(L"utf16.txt", CFile::modeCreate | CFile::modeWrite| CFile::typeUnicode);

BYTE bom[2] = { 0xFF, 0xFE };  
file.Write(bom, 2);
CString str = L"日本語";
file.WriteString(str);
file.Close();

ps,根据this page,代码页932和Shift-JIS之间存在一些问题,尽管我无法复制任何错误。

于 2016-05-19T05:01:03.870 回答