Linux下Java Spring Boot读取命令行参数无法识别德语变音符号
解决Java命令行参数中德语变音符号显示为??的问题
问题根源
命令行参数的编码由操作系统终端的字符编码决定,Java默认使用系统file.encoding属性解析参数,若终端编码与JVM默认编码不匹配,就会出现乱码(显示为??)。你尝试的两种编码转换未命中实际终端编码,因此无效。
解决方案
1. 确认终端与JVM的编码设置
先明确当前JVM默认编码和终端编码:
- 打印JVM编码:
System.out.println(System.getProperty("file.encoding")); - 终端编码查询:
- Windows cmd:执行
chcp命令,德语区通常返回1252(对应编码Windows-1252) - Linux/macOS:执行
echo $LANG,通常返回de_DE.UTF-8
- Windows cmd:执行
2. 针对终端编码进行正确转换
如果终端编码是Windows-1252,用以下方式修复参数:
String fixedArg = new String(args[0].getBytes(StandardCharset.ISO_8859_1), "Windows-1252");
如果终端使用UTF-8但JVM默认编码不是,直接用UTF-8解码:
String fixedArg = new String(args[0].getBytes(StandardCharset.ISO_8859_1), StandardCharset.UTF_8);
3. 强制JVM使用指定编码启动(最可靠)
启动Java程序时,添加-Dfile.encoding参数强制指定编码,比如强制使用UTF-8:
java -Dfile.encoding=UTF-8 YourMainClass Mötörhead
这样JVM会直接用指定编码解析命令行参数,无需后续转换。
4. 使用Console类读取参数(交互式场景)
如果是交互式输入参数,放弃args改用Console类读取,它会自动适配终端编码:
String input = System.console().readLine();
内容的提问来源于stack exchange,提问作者Sumit Yewale
相关产品推荐
相关产品推荐

