我正在使用从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'
}
导致这种不同行为的原因是什么?我如何确保在任何地方都能获得预期的结果?
答案 0 :(得分:0)
感谢@eckes和其他人的编译时间建议。通过在编译时指定编码,我能够获得所需的结果。
我添加到build.gradle
的设置是:
compileTestJava.options.encoding = 'UTF-8'
此选项仅影响测试类(这是我的问题所在)。您也可以使用:
compileJava.options.encoding = 'UTF-8'
如果您的生产代码中有需要编码的文本。
我遇到的另一种解决方案是:
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
(有趣的是,上述解决方案都没有改变file.encoding
系统属性的值。)