升级到Microsoft OpenJDK 17后非ASCII字符测试编码报错如何修复?
编码故障修复方案
该问题的核心原因是微软OpenJDK 17在部分操作系统环境下会继承系统默认字符编码(例如Windows环境默认是GBK编码),而非全局默认使用UTF-8,导致非ASCII字符在编译、运行、持久化过程中出现转码错误。你可以按以下优先级尝试修复:
- 强制指定JVM全局编码:在应用启动参数中添加
-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8,确保JVM所有字符串转换、IO操作、控制台输出默认使用UTF-8。如果你是通过Maven/Gradle执行测试,需要在对应测试插件的JVM参数配置项中添加上述参数,比如Maven的surefire插件新增jvmArgs配置,Gradle的test任务中新增jvmArgs配置。 - 统一项目编译编码:在构建工具配置中强制指定源码编译使用UTF-8编码,Maven可在pom.xml的properties节点中添加
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>,避免编译阶段将源码中的Unicode字符转换为乱码。 - 校验持久化链路编码:如果涉及数据库存储,需要确保数据库连接串显式指定UTF-8编码,例如MySQL连接串追加
useUnicode=true&characterEncoding=utf8mb4参数,同时确认对应库、表、存储字段的字符集设置为utf8mb4,避免特殊Unicode字符存储截断或乱码。 - 代码级显式指定编码:对于涉及字符串转字节流、IO读写的逻辑,直接在代码中显式传入
StandardCharsets.UTF_8作为编码参数,完全不依赖JVM默认编码配置,兼容性更强。
内容的提问来源于stack exchange,提问作者Vlad Mihalcea
相关产品推荐
相关产品推荐

