問題的原因應該在cmd的編碼和c++程序編碼(源文件編碼)的不同。cmd默認的是gbk編碼,而我用的vs code默認是utf-8編碼,因而在輸出中文文本時會出現亂碼。
但我也遇到了一個比較怪異的情況,就是cmd和cpp文件編碼都是gbk的情況下輸出中文依然會亂碼,但是當輸出的文本第一個字符是英文或者空格的時候就不亂碼了,這個問題依然沒有解決,搜索的時候發現有人也遇到過,但也不知道怎么解決的。
所以解決方案就是全部用utf-8編碼(搜索到的還有什么local、wcout、字符寬度、L" "什么的,但是沒太看懂)
1.在cmd里先運行命令
chcp 65001
然后再在命令行里啟動程序。這種修改cmd編碼的方式只能持續到這次命令行程序關閉為止。
2.或者在c++源代碼里更改cmd編碼
#include <cstdlib>//可以引入system("pause")來實現程序的暫停 using namespace std;//引入命名空間std,使得std::cout和std::endl可以直接省去std:: int main() { system("chcp 65001"); return 0; }
這樣有一點我覺得不好的是會顯示執行chcp這條命令的返回文本,不太好看
3.使用SetConsoleOutputCP
#include <windows.h>//用於函數SetConsoleOutputCP(65001);更改cmd編碼為utf8 using namespace std;//引入命名空間std,使得std::cout和std::endl可以直接省去std:: int main() { SetConsoleOutputCP(65001); return 0; }
4.使用舊版控制台
在使用上述1、2、3的設置后雖然可以輸出在源代碼里定義好的中文字符,但是在用cin讓用戶輸入時,卻不能正確輸出用戶輸入的中文字符。
在cmd的屬性頁面勾選使用舊版控制台后解決了上述所有的問題。(雖然不想扔鍋給cmd,但這么看來,好像還是cmd的鍋
5.追根溯源的終極原因
終於,在我遇到這個問題后的四個月后,上次因為這個問題詢問過的同學也遇到了這個問題。在同學地努力探索下,終於找到了原因是什么。
直接放他的文章鏈接了:mingw控制台中文亂碼