如何在Windows Shell中让Java打印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

