在Shift-JIS中编写CSV文件(MFC VC ++,Windows Embedded - WinCE)

时间:2016-05-19 02:45:18

标签: csv utf-8 mfc windows-ce shift-jis

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

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

我搜索了这个,最后我在stackOverflow上遇到了类似的问题: UTF-8, CString and CFile? (C++, MFC)

我尝试了他们的一些建议,最后得到了一个正确的UTF-8 CSV文件。

write-to-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,以及我应该对上述代码进行哪些更改?

感谢您提出任何建议和帮助。

1 个答案:

答案 0 :(得分:1)

Shift-JIS的代码页显然是932.使用WideCharToMultiByteMultiByteToWideChar进行转换。例如:

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,根据这个page,代码页932和Shift-JIS之间存在一些问题,尽管我无法复制任何错误。