Java启动时System.getProperty获取含中文路径乱码问题求助
JDK 8中文系统属性乱码问题解决
问题场景
在Windows 10中开启「Beta版:使用Unicode UTF-8提供全球语言支持」(系统默认字符集设为UTF-8)并重启后,使用JDK1.8.0_212执行以下命令启动Java应用:
java -Dfile.encoding=UTF-8 -Dv8.path="D:\中区path" App
调用System.getProperty("v8.path")返回乱码内容D:\涓尯path,而非预期的D:\中区path,进而触发NoSuchFileException导致应用崩溃。
补充信息
- CMD执行
chcp命令输出:Active code page: 65001 - 乱码字符的Unicode值:
'D' 68 ':' 58 '\\' 92 '\\' 92 '涓' 28051 '\uE15E' 57694 '尯' 23599 'p' 112 'a' 97 't' 116 'h' 104
问题原因
JDK 8对Windows系统的UTF-8全局语言支持存在兼容性缺陷:当系统默认代码页为65001(UTF-8)时,JVM读取命令行参数时会错误地将UTF-8编码的中文按GBK(或旧版系统默认编码)解码,导致乱码。例如"中区"的UTF-8字节序列E4 B8 AD E5 8C BA被当作GBK解码,就会生成错误的Unicode字符。
解决方案
1. 升级JDK版本(推荐)
JDK 11及以上版本彻底修复了Windows UTF-8系统区域下的命令行参数编码问题,升级后无需额外配置即可正确读取含中文的系统属性。
2. 添加JVM启动参数(JDK 8专属)
在启动命令中加入-Dsun.jnu.encoding=UTF-8参数,该参数控制JVM读取系统属性和环境变量时使用的编码,与file.encoding配合使用:
java -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dv8.path="D:\中区path" App
注意:此参数仅在JDK 8中有效,高版本JVM已移除该参数并统一编码处理逻辑。
3. 临时切换CMD代码页(应急方案)
若无法升级JDK或修改启动参数,可在启动应用前将CMD代码页切换回GBK(代码页936):
chcp 936 java -Dfile.encoding=UTF-8 -Dv8.path="D:\中区path" App
此方法会导致其他依赖UTF-8的输出出现乱码,仅适合临时应急使用。
内容的提问来源于stack exchange,提问作者Criwran
相关产品推荐
相关产品推荐

