1. 程式人生 > >vs 中文亂碼 (包括控制檯)

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為了支援其他系統,在高階儲存選項中可以設定編碼來進行相容。