我目前正在开发一种特别需要使用UTF-8的MFC程序.在某些时候,我必须将UTF-8数据写入文件;要做到这一点,我使用CFiles和CStrings.
当我将utf-8(俄语字符,更精确)的数据写入文件时,输出看起来像
Ðàñïå÷àòàíî:
Ñèñòåìà
Ïðîèçâîäñòâî
这一点绝对不是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
我错过了什么吗?我会用别的东西吗?有没有一些我错过的东西?
我会为你的智慧和经验,程序员,
编辑:
当然,正如我刚刚提出一个问题,我终于找到了一些可能有趣的东西,可以找到here.想到我可以分享一下.
编辑2:
好的,所以我添加了BOM到我的文件,现在包含中文字符,可能是因为我没有将我的行转换为UTF-8.添加bom我做了…
char BOM[3]={0xEF, 0xBB, 0xBF};
CSVFile.Write(BOM,3);
之后,我补充说
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);
但是,我无法编译,因为我不知道如何获得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 characters we have to add
size_t size = 0;
HRESULT hr = StringCchLength(TCHARBuf, MAX_PATH, &size);
//Add the line to the file
CSVFile.Write(TCHARBuf,size);
它编译得很好,但是当我看看我的新文件时,它和完全一样,当我没有所有这些新的代码(例如:Ðàñïå÷àòàí:) :).感觉就像我没有向前迈出一步,虽然我猜只有一件小事是将我与胜利分开的.
编辑4:
我删除了以前添加的代码,正如Nate所说,我决定使用他的代码,这意味着现在,当我添加我的行,我有…
CT2CA outputString(sWorkingLine, CP_UTF8);
//Add line to file.
CSVFile.Write(outputString,::strlen(outputString));
一切都很好,但是俄罗斯的人物都显示为越来越近了,但还是不行.
Btw,我想感谢所有尝试/试图帮助我的人,很高兴.我已经停留了一段时间了,我迫不及待地想要解决这个问题.
最后编辑(我希望)
通过改变我第一次得到我的UTF-8字符(我重新编码不知道)的方式,这是我的新方式输出文本是错误的,我得到可以接受的结果.通过在文件开头添加UTF-8 BOM字符,可以在其他程序(如Excel)中将Unicode读取为Unicode.
欢呼!谢谢大家!