11

このプログラムを考えてみましょう:

import java.util.regex.Pattern;
public class xx {

    /*
     *  Ñ
     *  LATIN CAPITAL LETTER N WITH TILDE
     *  Unicode: U+00D1, UTF-8: C3 91
     */
    public static final String BIG_N = "\u00d1";

    /*
     *  ñ
     *  LATIN SMALL LETTER N WITH TILDE
     *  Unicode: U+00F1, UTF-8: C3 B1
     */
    public static final String LITTLE_N = "\u00f1";

    public static void main(String[] args) throws Exception {
        System.out.println(BIG_N.equalsIgnoreCase(LITTLE_N));
        System.out.println(Pattern.compile(BIG_N, Pattern.CASE_INSENSITIVE).matcher(LITTLE_N).matches());
    }
}

Ñ は ñ の大文字バージョンであるため、次のように出力されると予想されます。

true
true

しかし、実際に出力されるもの (Java 1.7.0_17-b02) は次のとおりです。

true
false

なんで?

4

1 に答える 1

20

デフォルトでは、大文字と小文字を区別しない一致では、US-ASCII 文字セットの文字のみが一致すると想定されます。このフラグと一緒に UNICODE_CASE フラグを指定すると、Unicode 対応の大文字と小文字を区別しない一致を有効にできます。

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#CASE_INSENSITIVE

そして完全を期すために; あなたまたは ( |) フラグを一緒に。

Pattern.compile(BIG_N, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE)
于 2013-05-20T22:21:43.633 に答える