You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Windows Shell中让Java打印Unicode字符串?

解决Java在Windows Shell中打印Unicode字符串的问题

别担心,这绝对不是常识问题——Windows控制台的Unicode处理一直是个历史遗留的小坑,哪怕是对Unicode支持很好的Java也得绕两步,完全理解你从C转过来想顺畅处理Unicode却碰壁的失望!

问题根源

IntelliJ IDEA的控制台是IDE自己实现的,默认就用UTF-8编码,所以直接打印"سلام"没问题;但Windows原生的Cmd/PowerShell默认用的是GBK(或者其他非UTF-8的系统编码),而Java的System.out默认会依赖系统编码输出,这就导致Unicode字符被转成了错误的编码,最终显示乱码。

解决方案

这里给你几个实用的解决办法,按从简单到可靠的顺序来:

1. 临时切换控制台编码(快速测试用)

先在Cmd/PowerShell里执行这条命令,把控制台编码切换为UTF-8:

chcp 65001

然后再运行你的Java程序。另外要注意,确保控制台的字体支持阿拉伯文(比如换成Consolas、Segoe UI这类支持Unicode的字体),不然即使编码对了,字符也显示不出来。

2. 在代码里强制指定输出流编码

修改你的代码,让System.out强制用UTF-8输出,配合上面的chcp 65001命令,就能稳定显示Unicode了:

import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

public class HelloUnicode {
    public static void main(String[] args) {
        // 重新设置System.out为UTF-8编码
        System.setOut(new PrintStream(System.out, true, StandardCharsets.UTF_8));
        System.out.println("سلام");
    }
}

3. 使用Java的Console类(更可靠的控制台交互)

Java提供了专门的java.io.Console类来处理控制台输入输出,对Unicode的支持比System.out更稳定,而且不需要依赖系统编码设置(当然控制台本身还是得支持Unicode字体):

public class UnicodeConsoleDemo {
    public static void main(String[] args) {
        Console console = System.console();
        if (console != null) {
            // 用Console的printf方法输出,自动适配Unicode
            console.printf("سلام%n");
        } else {
            //  fallback到System.out(比如在IDE里运行时)
            System.setOut(new PrintStream(System.out, true, StandardCharsets.UTF_8));
            System.out.println("سلام");
        }
    }
}

4. 改用Windows Terminal(推荐长期方案)

微软现在推出的Windows Terminal默认就支持UTF-8,而且对各种Unicode字符的字体支持更好,基本不需要额外设置,直接运行你的Java程序就能正常显示"سلام"这类字符了,体验比传统Cmd/PowerShell好很多。

最后说一句

Java本身对Unicode的支持是非常完善的,你当初转Java的选择完全没错,只是Windows控制台的老问题拖了后腿,解决之后就能顺畅处理各种Unicode文本啦!

内容的提问来源于stack exchange,提问作者Ali Rahimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:04:20