vs2015:/utf-8選項解決UTF-8 without BOM 源碼中文輸出亂碼問題

轉載自:https://blog.csdn.net/10km/article/details/80203286

本來我已經參考網上關於C++中文輸出亂碼的文章解決了,如下面的代碼輸出前調用wcout.imbue設置locale,就可以正常輸出中文了。

std::wcout.imbue(std::locale(std::locale(), "", LC_CTYPE));
std::wcout << L"江清月近人" << std::endl;
  • 1
  • 2

但是同樣的方法換在另一個程序中還是輸出亂碼。反覆查找原因,最後發現是兩個源碼的編碼格式不同。雖然都是UTF-8,但是能正確輸出中文的源碼文件是帶BOM頭的,另一個是不帶BOM的。參考這個篇文章《MSVC中C++ UTF8中文編碼處理探究》搞明白了MSVC對於不帶BOM的UTF-8文件,默認會根據本地locale的設置來決定文件的編碼(對於簡體中文系統,就是GBK)。所以會對於UTF-8 without BOM的代碼文件輸出中文就是亂碼。對於UTF-8 with BOM文件,會正確將其按照UTF-8來識別。

/utf-8 編譯選項

MSVC對於UTF-8 without BOM格式支持不好,這個問題由來已久,在VS2015之前的版本一直存在。
在VS2015版本(Visual Studio 2015 Update 2),增加一個編譯選項/utf-8,該編譯選項的作用就是將源碼字符集和執行文件字符集指定爲UTF-8。增加該編譯選項後,再重新編譯運行,程序正確輸出中文,問題解決。

參見微軟官網:《/utf-8 (Set Source and Executable character sets to UTF-8)》

這裏寫圖片描述

這裏寫圖片描述

#pragma execution_character_set(“utf-8”)

其實網上可以找到不少文章提到還有另一個解決辦法, 就是在源碼中插入預處理指令#pragma execution_character_set("utf-8")

#if defined(_MSC_VER) && (_MSC_VER >= 1900)    
# pragma execution_character_set("utf-8")    
#endif
  • 1
  • 2
  • 3

這是關於該指令的官網說明:《execution_character_set》
根據這個說明,這個指令似乎是VS2015纔有的(我的電腦沒有別的版本的MSVC所以沒辦法驗證VS2015之前的版本是否支持這個指令),但是在Visual Studio 2015 Update 2版本就廢棄了。我的VS2015版本是Visual Studio 2015 Update 3,對這個指令確實無效。

Visual Studio 保存UTF-8 without BOM

爲什麼要用UTF-8 without BOM來保存源碼?
主要的原因是linux下編譯器不支持UTF-8 with BOM的源碼編譯,其實如果你的項目沒有跨平臺編譯的要求,並不一定要將源碼保存爲UTF-8 without BOM格式。
如果你希望在Visual Studio中將源碼保存爲UTF-8 without BOM格式,如下設置一下高級保存選項就可以了。
這裏寫圖片描述

默認是Unicode(UTF-8 帶簽名)-代碼頁65001,這裏要修改爲Unicode(UTF-8 無簽名)-代碼頁65001
這裏寫圖片描述

參考文章

《MSVC中C++ UTF8中文編碼處理探究》
《/utf-8 (Set Source and Executable character sets to UTF-8)》
《execution_character_set》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章