Gradle运行JUnit测试遇编码异常,配置编码无效求助
解决Gradle运行JUnit测试的编码异常问题
我之前也碰到过类似的Gradle编码坑,结合你提到的细节——Ant下UTF-8运行正常、HTML文件里有ASCII#146的撇号,给你几个针对性的解决方向:
先明确问题根源
首先要搞清楚:ASCII#146其实不是标准ASCII(标准ASCII只有0-127),它是Windows-1252编码里的智能撇号(’)。Ant能正常运行,大概率是Ant自动兼容了这个非标准编码,或者Gradle的测试环节编码配置没覆盖到位。
针对性解决步骤
1. 给Gradle的测试任务明确设置UTF-8编码
很多人只配置了编译环节的编码,但测试任务是单独启动JVM的,需要单独指定编码参数。在build.gradle里添加:
// 确保编译环节用UTF-8 tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } // 强制测试任务的JVM使用UTF-8 tasks.withType(Test) { systemProperty 'file.encoding', 'UTF-8' jvmArgs '-Dfile.encoding=UTF-8' }
配置完后执行gradle clean test试试,很多时候就是测试JVM的编码没跟上导致的问题。
2. 处理HTML文件的编码问题
既然测试读取的HTML文件里有Windows-1252的字符,有两种处理方式:
- 转文件编码:用Notepad++、VS Code这类编辑器打开HTML文件,直接转成UTF-8编码保存(VS Code右下角可以切换编码,选“通过编码保存”→UTF-8),从根源解决字符编码不兼容的问题。
- 代码里指定读取编码:如果不想修改文件,在测试代码读取HTML时,显式指定用Windows-1252编码读取:
// 示例:用Files读取文件 List<String> contentLines = Files.readAllLines( Paths.get("你的测试HTML路径"), Charset.forName("Windows-1252") ); // 或者用BufferedReader try (BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream("你的测试HTML路径"), "Windows-1252") )) { String line; while ((line = reader.readLine()) != null) { // 处理内容 } }
3. 临时强制Gradle运行时编码
如果上面的配置还是没效果,可以在命令行直接指定编码参数运行测试:
gradle -Dfile.encoding=UTF-8 test
这种方式会强制Gradle整个运行环境用UTF-8编码,能快速验证是不是系统编码导致的问题。
4. 对比Ant和Gradle的配置差异
你提到Ant里配置项看似一致,但Ant的<test>任务默认可能会继承<javac>的编码设置,而Gradle的测试任务是独立的。可以检查Ant的build.xml里,是不是在<junit>任务里也显式设置了encoding="UTF-8",或者添加了JVM参数,把对应的配置同步到Gradle里。
内容的提问来源于stack exchange,提问作者Ed Dunn
相关产品推荐
相关产品推荐

