@
問題描述
通過
new Scanner(System.in).next();
輸入一段中文字符串並顯示到控制台時,輸出的總是一些00???@@@
等之類的亂碼。
代碼如下:
Scanner sc = new Scanner(System.in);
System.out.println("請輸入中文:");
String str = sc.next();
System.out.println(str);
問題截圖
問題分析
亂碼現象百分之百都是編碼問題導致的,而我們日常工作學習中,大致有三個方面涉及到編碼格式:
*源文件的查看
*源文件編譯和調試
*終端顯示運行交互過程
除了以上三點,其實還有一個層面,那就是:
*用戶鍵入層面
這是我們Scanner獲取中文字符串輸出時產生亂碼的根結。
問題原因
由於中文操作系統,用戶鍵入的中文默認采用的都是GBK編碼。所以一旦編譯和顯示采用的編碼格式和用戶鍵入的格式不同,就會造成亂碼。
解決思路
我們的解決思路是,確保編譯和終端交互采用的編碼格式和Scanner獲取的中文字符串格式一樣,都是
GBK
格式。
首先,明確開發環境的編碼格式
源文件編碼
編譯器右下角顯示的就是我們源文件的編碼格式,點擊如圖的
UTF-8
位置就可以切換源文件打開或者保存的格式。一般這里的編碼格式關系到的是我們查看源文件,對控制台輸出沒影響。
終端編碼
由於vscode采用的終端一般是基於cmd或者powershell的,在終端中輸入
chcp
就能查看到終端采用的編碼格式。
如圖,返回結果是
活動代碼頁:65001
,65001代表的是UTF-8編碼,而我們的簡體中文GBK編碼是:936
我們只需要輸入:chcp 936
就可以把終端切換成GBK編碼。
可是特殊情況,即便切換到936,最終運行的時候還是會變成65001。看下圖:
在我們調試運行的時候,控制台總是跳過一大串如圖的字,觀察發現,其中加載過一個launcher.bat文件。ctrl+左鍵打開這個文件:
如圖我們發現里面有一行代碼
@chcp.com 65001 > NUL
,我們把其中的65001改成936.
如果進行到這步還是亂碼,那只剩下編譯時候的編碼格式了。
編譯編碼格式
如圖點擊vscode側欄運行調試,點擊設置小圖標,打開launch.json
如圖,添加"encoding":"GBK"
,意思就是此文件編譯時采用GBK編碼。