1

基本的な 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 で 1 つのテスト ケースが失敗します。

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)

そして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)

助けてくれてどうもありがとう!ロルフ

4

1 に答える 1

2

ケースフォールディングは複雑な問題であり、適切なロケールを使用しない限り、「正しい」ものを取得することは明らかに不可能です。

この W3 ページはこれを扱っています: http://www.w3.org/International/wiki/Case_folding

はい、おそらくここで JDK の依存関係が見つかりました。しかし、ロケールが処理しているテキスト (またはテキスト フラグメント) の言語と一致しない場合、大文字と小文字の折り畳みが一貫しているとは思わないでしょう。

于 2013-05-10T16:59:08.690 に答える