【问题标题】:in VC++ Cfile write with UTF8 encoding在 VC++ Cfile 中使用 UTF8 编码写入
【发布时间】:2014-02-12 13:36:00
【问题描述】:

使用 CFile 对象,代码以“ANSI as UTF8”编码打开一个文件。修改文本并使用 write 函数覆盖文件后,编码将更改为 ANSI。

尝试使用以下代码更改正在写入的文本的编码。

CComBSTR bstrContent;
m_spDOMDocument->get_xml(&bstrContent);
CString strContent(bstrContent);
CT2CA outputString(strContent, CP_UTF8);

File.SetLength(0);
File.SeekToBegin();
File.Write(strContent, ::strlen(outputString));
File.SeekToBegin();

这正如UTF-8, CString and CFile? (C++, MFC)中所建议的那样

文件仍以 ANSI 编码写入。 文件怎么写成UTF 8格式?

【问题讨论】:

    标签: visual-c++ encoding utf-8 mfc


    【解决方案1】:

    您没有正确使用 CT2CA,无论如何只需使用 CW2CA 从宽 BSTR 直接转换。

    试试这个:

    CStringA outputString( CW2CA(bstrContent, CP_UTF8))
    

    然后将基于outputStringchar 写入文件而不是strContent(我无法判断它是否宽)。

    另外,您没有编写 BOM(字节对象标记),这可能会导致某些编辑器出现问题。看看这个: What's different between UTF-8 and UTF-8 without BOM?

    【讨论】:

    • 感谢您的快速回复。我尝试使用 CStringA outputString( CT2CA(strContent, CP_UTF8)) 它仍然没有以 UTF-8 编码格式写入。如何用 BOM 编写? (我是新手……我的问题可能很幼稚!)
    • 我能够使用以下代码添加 BOM char BOM[3]={0xEF, 0xBB, 0xBF}; File.Write(BOM,3);它创建一个 UTF8 文件。尝试使用 IXMLDmoDocument2Ptr 对象加载此文件失败。只有 ANSI 或“ANSI as UTF-8”文件以这种方式加载。将文件转换为“ANSI as UTF-8”编码,文件加载没有任何问题
    • 您尝试过 CW2CA 吗?另外,您是否在启用 Unicode 的情况下进行编译,即您的 CStrings 是否基于 wchar_t?
    • 顺便说一句:BOM 表示“字节顺序标记”而不是“字节对象标记”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多