我必须手动将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
答案 0 :(得分:2)
根据Microsoft's documentation for _tfopen_s
(强调补充):
当Unicode流I / O功能在文本模式(默认)下运行时,假定源或目标流是多字节字符序列。因此,Unicode流输入函数将多字节字符转换为宽字符(就像通过调用mbtowc函数一样)。出于同样的原因, Unicode流输出函数将宽字符转换为多字节字符(就像通过调用wctomb函数一样)。
您需要将UTF-16字符写入该文件,然后将翻译。您需要编写单个16位0xEF,0xBB,0xBF
而不是3字节序列0xfeff
。