c语言cfile用法,UTF-8,CString和CFile? (C,MFC)

我目前正在开发一种特别需要使用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.

欢呼!谢谢大家!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值