字符串比较 - JDK版本产生不同的结果

时间:2013-05-10 16:30:12

标签: string java java-7 java-6

我已经实现了一个基本的Guava谓词:

containsPatternIgnoreCase(@Nullable final String input) {
   checkNotNull(input);
   return new Predicate<String>() {
       @Override
       public boolean apply(@Nullable String current) {
           checkNotNull(current);
           return current.toLowerCase(ENGLISH).contains(input.toLowerCase(ENGLISH));
       }
   };
}

一切都很好,但Travis上的一个测试用例失败了:

assertThat(containsPatternIgnoreCase("TURKİYE").apply("turkiye güzel")).isTrue();

我负责不在我的实现中继承默认语言环境,所以我真的很想知道那里有什么问题。它可能取决于JDK版本吗?

以下是我的机器上使用的内容:

java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06-451-10M4406)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01-451, mixed mode)

特拉维斯CI:

java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)

非常感谢你的帮助! 罗尔夫

1 个答案:

答案 0 :(得分:2)

Casefolding是一个复杂的问题,除非你使用正确的语言环境,否则显然不可能获得“正确”。

此W3页面处理此问题:http://www.w3.org/International/wiki/Case_folding

是的,您可能在这里找到了JDK依赖项。但是,如果语言环境与您正在处理的文本(或文本片段)的语言不匹配,则修复可能不会期望大小写折叠是一致的。