正如标题所说,我一直在尝试将用户输入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,以及我应该对上述代码进行哪些更改?
感谢您提出任何建议和帮助。
答案 0 :(得分:1)
Shift-JIS的代码页显然是932.使用WideCharToMultiByte
和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,根据这个page,代码页932和Shift-JIS之间存在一些问题,尽管我无法复制任何错误。