Java字符显示异常求助:含特殊字符的用户名输入输出异常
Windows终端(Git Bash/PowerShell)下Java UTF-8输入输出乱码解决方法
在Windows的Git Bash和PowerShell中运行Java程序获取用户名输入时,带特殊字符(如João中的õ)的内容无法正常显示。尝试过以下操作但未解决:
- 给
Scanner指定UTF-8编码,输出显示Jo?o - 运行前执行
chcp 65001切换代码页,输出变为Joo - 重定向
System.out到UTF-8的PrintStream,输出出现乱码Jo´┐¢o
核心解决思路
要解决这个问题,需要同时保证三个环节的编码统一为UTF-8:
- Java程序的输入编码(
Scanner读取控制台输入) - Java程序的输出编码(
System.out输出到控制台) - Windows终端的编码和字体支持
正确代码实现
以下代码同时配置输入和输出的UTF-8编码,确保字符读取和输出都正确:
import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.PrintStream; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class UserInputFix { public static void main(String[] args) { // 强制Scanner使用UTF-8读取输入 Scanner scanner = new Scanner(System.in, StandardCharsets.UTF_8); try { // 重置System.out为UTF-8编码的打印流,开启自动刷新 System.setOut(new PrintStream( new FileOutputStream(FileDescriptor.out), true, StandardCharsets.UTF_8.name() )); System.out.print("请输入你的名字:"); String name = scanner.nextLine(); System.out.println("你好," + name); } catch (Exception e) { e.printStackTrace(); } finally { scanner.close(); } } }
终端环境配置
PowerShell配置步骤
- 打开PowerShell,执行命令切换到UTF-8代码页:
chcp 65001 - 检查终端字体是否支持UTF-8:右键终端标题栏 → 属性 → 字体,选择Consolas、微软雅黑等支持特殊字符的字体
- 编译并运行Java程序时,添加JVM参数强制使用UTF-8编码:
javac UserInputFix.java java -Dfile.encoding=UTF-8 UserInputFix
Git Bash配置步骤
- 检查当前编码设置,执行命令:
若输出不是echo $LANGzh_CN.UTF-8或en_US.UTF-8,则修改~/.bashrc文件,添加:
保存后重启Git Bash生效export LANG=zh_CN.UTF-8 - 编译运行程序时同样添加JVM参数:
javac UserInputFix.java java -Dfile.encoding=UTF-8 UserInputFix
为什么之前的尝试失败?
- 仅设置
Scanner的UTF-8编码,但System.out仍使用终端默认编码(如GBK)输出,导致字符转码错误 - 仅执行
chcp 65001但未同步设置JVM的默认编码,JVM仍用系统默认编码处理输入输出 - 第二次修改代码时未指定
Scanner的输入编码,输入的õ已被错误解码,后续输出自然乱码
内容的提问来源于stack exchange,提问作者losdekai
相关产品推荐
相关产品推荐

