繁体   English   中英

编写 UTF-8 BOM 时出现异常

[英]Getting exception when writing UTF-8 BOM

我必须手动将 UTF-8 BOM 添加到一个简单的文本文件中。 但是,我无法使用以下方法编写 BOM。 以我相当有限的 C++ 知识,我实际上不明白我做错了什么。 我认为这一定与我只写 3 个字节的事实有关 - 无论出于何种原因,系统都希望我写 2 的倍数。 代码以 Unicode 字符集编译。 欢迎任何将我指向正确方向的提示。

FILE* fStream;
errno_t e = _tfopen_s(&fStream, strExportFile, TEXT("wt,ccs=UTF-8"));   //UTF-8

if (e != 0) 
{
    //Error Handling
    return 0;
}

CStdioFile* fileo = new CStdioFile(fStream);
fileo->SeekToBegin();

//Write BOM
unsigned char bom[] = { 0xEF,0xBB,0xBF };
fileo->Write(bom,3);
fileo->Flush();  //BOOM: Assertion failed buffer_size % 2 == 0

根据微软的_tfopen_s文档(强调):

当 Unicode 流 I/O 函数在文本模式(默认)下运行时,源或目标流被假定为多字节字符序列。 因此,Unicode 流输入函数将多字节字符转换为宽字符(就像调用 mbtowc 函数一样)。 出于同样的原因, Unicode 流输出函数将宽字符转换为多字节字符(就像调用 wctomb 函数一样)。

您需要将 UTF-16 字符写入文件,然后将其转换为. 您需要编写单个 16 位0xfeff 0xEF,0xBB,0xBF而不是 3 字节序列0xEF,0xBB,0xBF 0xfeff

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM