vs 中文亂碼 (包括控制檯)
轉載:http://www.cnblogs.com/Harley-Quinn/p/7487745.html
最近剛換上VS2017,由於手頭又要做個MFC的程式,所以寫控制檯程式做功能測試,然後發現居然亂碼了。
於是用VS2017新建windows控制檯應用程式,在main函式種加一句printf("你好");後,執行結果依然亂碼
用notapad++開啟該檔案後,點選選單欄的編碼一項,發現是UTF-8無BOM格式編碼,然後改成以ANSI格式編碼後
也就是說VS是用UTF-8來編碼程式碼檔案的,編譯出的程式中字串也是按照UTF-8編碼的,而控制檯卻是按照ANSI編碼來理解的。
打個比方,A用0x00代表“是”,B用0x00代表“否”,A傳送0x00給B,然後B顯示的是“否”。
那麼先說解決方案吧,也就是讓VS對檔案用ANSI編碼就行了,在網上搜索了一番後很輕鬆地找到了解決方案
VS選單項的工具-->自定義,開啟“自定義”對話方塊,然後選中“命令”選項卡,點選“新增命令”按鈕
然後在[檔案]種找到[高階儲存選項],點確定,可以發現VS選單欄多了高階儲存選項一欄,只要游標在程式碼檔案種,就可以點選該選單項。
把編碼改成簡體中文(GB2312),然後重新編譯執行,顯示就正確了。
在cmd視窗種輸入chcp命令也可以看到,windows命令列視窗的活動內碼表是936。
當然,我把修改前的檔案Project2.cpp和修改後的檔案Project1.cpp匯入進了Linux系統裡,用locale命令可以看到系統預設是以UTF-8編碼
$ locale LANG=en_US.UTF-8 LANGUAGE=en_US LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
用file命令可以看到
$ file Project1.cpp Project1.cpp: C source, ISO-8859 text, with CRLF line terminators $ file Project2.cpp Project2.cpp: C source, UTF-8 Unicode text, with CRLF line terminators
一個是ISO-8859,一個是UTF-8,現在UTF-8是大勢所趨,像MFC的字串類CString早在十年前的VS就是CStringW了(即MFC專案種預設編碼是UTF-8),只是在之前的VS版本種,控制檯程式的編碼還是適應命令列視窗的。
另外注意,後半句,line terminators(換行符)是CRLF。再回到剛才的高階儲存選項對話方塊
在windows中換行符是"\r\n",而Unix系(包括Linux)的換行符是"\n",VS2017為了支援其他系統,在高階儲存選項中可以設定編碼來進行相容。