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