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

String 字符串比较-JDK版本产生不同的结果,string,java,java-7,java-6,String,Java,Java 7,Java 6,我实现了一个基本的番石榴谓词: containsPatternIgnoreCase(@Nullable final String input) { checkNotNull(input); return new Predicate<String>() { @Override public boolean apply(@Nullable String current) { checkNotNull(current);

我实现了一个基本的番石榴谓词:

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));
       }
   };
}
在我的实现中,我注意到没有从默认语言环境继承,所以我真的很想知道那里会出什么问题。它会依赖于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)
关于Travis 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)
非常感谢你的帮助!
Rolf

折叠箱子是一个复杂的问题,除非使用正确的语言环境,否则显然不可能得到“正确的”

本W3页涉及以下内容:


是的,您可能在这里发现了JDK依赖关系。但是,如果语言环境与您正在处理的文本(或文本片段)的语言不匹配,那么修复方法可能不会期望大小写折叠是一致的

System.out.println(“turkiye güzel.toLowerCase(Locale.ENGLISH).包含(“TURKİYE.toLowerCase(Locale.ENGLISH))在我的机器(JDK 1.7.0_17)上打印
false
。也许有人可以尝试使用JDK 6.Hmmm,我真的不知道逻辑结果应该是什么:-(实际上这是:
System.out.println(“TURKİYE.toLowerCase(Locale.ENGLISH));
prints
turki̇YE
(没有真正的引号,但不能在这里插入实际字符),但为什么同一条指令会产生“turkiye”在我的机器上?我不明白。任何时候都不会检索到默认区域设置,或者是吗?这里的系统依赖性是什么?我真的怀疑这是一个突破性的改变,在Travis上设置OpenJDK 6可以解决这个问题。我确实不希望有一个最佳的解决方案,但希望有一个稳定的解决方案。这里的情况似乎不是这样的:-(它是稳定的……对于给定的JRE、库、操作系统和计算机,它将返回相同的结果。创建使用区域设置的整个机制是为了跨计算机和国际边界提供稳定的结果。您所描述的是正确的。但是,对于所有JRE(至少来自一个特定的供应商),它应该是稳定的),你不觉得吗?@Rolf-这很好。但是我们不能确切地指出什么改变了以及(更重要的是)为什么。如果你不知道它为什么改变了,就很难做出不应该改变的判断。(一般来说,对Java所做的每一次“破坏性”改变都有一个很好的理由。)您不能期望稳定性和bug修复。
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)