我目前正在开发一个专门用于UTF-8的MFC程序.在某些时候,我必须将UTF-8数据写入文件中; 要做到这一点,我正在使用CFiles和CStrings.
当我将utf-8(俄语字符,更准确)数据写入文件时,输出看起来像
Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî
Run Code Online (Sandbox Code Playgroud)
等等.这绝对不是utf-8.要正确读取这些数据,我必须更改我的系统设置; 将非ASCII字符更改为俄语编码表确实有效,但随后我所有基于拉丁语的非ascii字符都会失败.无论如何,我就是这样做的.
CFile CSVFile( m_sCible, CFile::modeCreate|CFile::modeWrite);
CString sWorkingLine;
//Add stuff into sWorkingline
CSVFile.Write(sWorkingLine,sWorkingLine.GetLength());
//Clean sWorkingline and start over
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?我应该用别的东西吗?我错过了什么样的捕获?我会为你的智慧和经验而努力,和其他程序员一样.
编辑:当然,正如我刚问了一个问题,我终于找到了一些可能有趣的东西,可以在这里找到.以为我可能会分享它.
编辑2:
好的,所以我将BOM添加到我的文件中,该文件现在包含chineese字符,可能是因为我没有将我的行转换为UTF-8.添加bom我做了...
char BOM[3]={0xEF, 0xBB, 0xBF};
CSVFile.Write(BOM,3);
Run Code Online (Sandbox Code Playgroud)
之后,我补充说......
TCHAR TestLine;
//Convert the line to UTF-8 multibyte.
WideCharToMultiByte (CP_UTF8,0,sWorkingLine,sWorkingLine.GetLength(),TestLine,strlen(TestLine)+1,NULL,NULL);
//Add the line to file.
CSVFile.Write(TestLine,strlen(TestLine)+1);
Run Code Online (Sandbox Code Playgroud)
但后来我无法编译,因为我真的不知道如何获得TestLine的长度.strlen似乎不接受TCHAR. 固定,使用1000的静态长度.
编辑3:
所以,我添加了这段代码......
wchar_t NewLine[1000];
wcscpy( NewLine, CT2CW( (LPCTSTR) sWorkingLine ));
TCHAR* TCHARBuf = new TCHAR[1000];
//Convert the line to UTF-8 multibyte.
WideCharToMultiByte (CP_UTF8,0,NewLine,1000,TCHARBuf,1000,NULL,NULL);
//Find how many …Run Code Online (Sandbox Code Playgroud)