@
目录问题描述
通过
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编码。