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

时间:2017-11-10 00:49:25

标签: java string unicode-normalization

我正在使用从this answer

获取的以下方法/代码对一些带重音的文本进行规范化

去除口音:

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)运行它,我得到:

ArvAztArA tAkArfArAgA

在这两种情况下,我使用的是同一台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'
}

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

1 个答案:

答案 0 :(得分:0)

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

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

compileTestJava.options.encoding = 'UTF-8'

此选项仅影响测试类(​​这是我的问题所在)。您也可以使用:

compileJava.options.encoding = 'UTF-8'

如果您的生产代码中有需要编码的文本。

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

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

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

相关问题