[英]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.