Java 为什么我的文本规范化在不同的环境中表现不同?

Java 为什么我的文本规范化在不同的环境中表现不同?,java,string,unicode-normalization,Java,String,Unicode Normalization,我正在使用以下方法/代码对一些重音文本进行规范化,这些方法/代码取自 重音删除: String accented = "árvíztűrő tükörfúrógép"; String normalized = Normalizer.normalize(accented, Normalizer.Form.NFD); normalized = normalized.replaceAll("[^\\p{ASCII}]", ""); System.out.println(normalized); 当

我正在使用以下方法/代码对一些重音文本进行规范化,这些方法/代码取自

重音删除:

String accented = "árvíztűrő tükörfúrógép";
String normalized = Normalizer.normalize(accented,  Normalizer.Form.NFD);
normalized = normalized.replaceAll("[^\\p{ASCII}]", "");
System.out.println(normalized);
当我使用IntelliJ运行此测试时(作为单元测试的一部分),这将给出预期结果:

arvizturo tukorfurogep
如果我从命令行(通过gradle)运行此命令,我会得到:

在这两种情况下,我都使用相同的PC和Java
1.8.0_151

build.gradle
中的相关部分:

apply plugin: 'java'
apply plugin: 'idea'
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
  testCompile group: 'junit', name: 'junit', version: '4.12'
}

是什么导致了这种不同的行为?我如何确保在任何地方都能得到预期的结果?

感谢@eckes和其他人的编译时建议。通过在编译时指定编码,我能够获得所需的结果

我添加到
build.gradle
的设置是:

compileTestJava.options.encoding = 'UTF-8'
此选项仅影响测试类(这就是我的问题所在)。您还可以使用:

compileJava.options.encoding = 'UTF-8'
如果生产代码中有需要编码的文本

我遇到的另一个解决方案是:

tasks.withType(JavaCompile) {
  options.encoding = 'UTF-8'
}

(有趣的是,上面的解决方案都没有改变
文件.encoding
系统属性的值。)

你能分享你的gradle文件吗,因为我用gradle尝试了相同的代码,它起作用了。问题更新为
gradle
代码片段。你的gradle中的运行任务在哪里?,您在gradle中使用如下任务运行代码:task(runui,dependsOn:'classes',type:JavaExec){main='stockticker.ui.StockTickerDriver'classpath=sourceset.main.runtimeClasspath}在命令行上,我键入
gradle clean test
Imagree,看起来更像是编译问题,而不是运行时问题。定义源代码编码(或仅在源代码中使用Unicode转义和ascii)
tasks.withType(JavaCompile) {
  options.encoding = 'UTF-8'
}