repl.it
@satob/

BreakIteratorTest

Java

No description

fork
loading
Files
  • Main.java
Main.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import java.text.BreakIterator;

class Main {
  public static void main(String[] args) {
System.out.println("abc".split("").length);

    // (a) 一般的な非漢字「あ」
    //     (1書記素=1ユニット=1コードポイント)
    System.out.println("\u3042");
    // 1書記素とカウントすべきところ、正しく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u3042")); // -> 1

    // (b) サロゲートペア「𠮷」
    //     (1書記素=2ユニット=1コードポイント)
    System.out.println("\ud842\udfb7");
    // 1書記素とカウントすべきところ、正しく1書記素とカウントされる
    System.out.println(getGraphemeLength("\ud842\udfb7")); // -> 1

    // (c) 異体字セレクタつき文字「侮」
    //     (1書記素=2ユニット=2コードポイント)
    //     ただし2コードポイント目は異体字セレクタ(文字ではない)。
    System.out.println("\u4fae\ufe00");
    // 1書記素とカウントすべきところ、正しく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u4fae\ufe00")); // -> 1

    // (d) JIS X 0213合字「˥˩」
    //     (1書記素=2ユニット=2コードポイント)
    //     1文字目も2文字目も単独で書記素として意味をなす。
    System.out.println("\u02e5\u02e9");
    // 1書記素とカウントすべきところ、誤って2書記素とカウントされる
    System.out.println(getGraphemeLength("\u02e5\u02e9")); // -> 2

    // (e) JIS X 0213合字「カ゚」
    //     (1書記素=2ユニット=2コードポイント)
    //     2コードポイント目は合字用文字で、
    //     JIS X 0213非漢字に定義されている正しい合字の組み合わせ。
    System.out.println("\u30ab\u309a");
    // 1書記素とカウントすべきところ、正しく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u30ab\u309a")); // -> 1

    // (f) (e)の1コードポイント目と2コードポイント目を逆にしたもの
    //     JIS X 0213非漢字に定義されていない組み合わせ。
    //     2ユニット、2コードポイントだがJIS X 0213の文字としては不当。
    //     1コードポイント目は合字用文字だが、組み合わせる文字がないので
    //     表示時には合わせて2書記素ぶんの幅をとる。
    System.out.println("\u309a\u30ab");
    // 正しいは判断つかないが、ともかく2書記素とカウントされる
    System.out.println(getGraphemeLength("\u309a\u30ab")); // -> 2

    // (g) JIS X 0213にない合字「『ま』にマル」
    //     2ユニット、2コードポイントだがJIS X 0213の文字としては不当。
    //     フォントの実装上1書記素の幅で表示されるが、JIS X 0213の規格としては
    //     2書記素ぶんになるのでは?
    System.out.println("\u307e\u309a");
    // 正しいは判断つかないが、ともかく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u307e\u309a")); // -> 1
    
    // (h) (e)の2コードポイント目だけを単独でカウント
    //     1ユニット、1コードポイントだがJIS X 0213の文字としては不当。
    //     (f)の11コードポイント目と同様、表示時には1書記素ぶんの幅をとる。
    System.out.println("\u309a");
    // 正しいは判断つかないが、ともかく1書記素とカウントされる
    System.out.println(getGraphemeLength("\u309a")); // -> 1

    // (i) (おまけ)ZWJを使った絵文字「👨‍👩‍👦」
    //     8ユニット、5コードポイント、1書記素。
    System.out.println("\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66");
    System.out.println(getGraphemeLength("\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66")); // -> 5
  }

  public static int getGraphemeLength(String value) {
    BreakIterator it = BreakIterator.getCharacterInstance();
    it.setText(value);
    int count = 0;
    while (it.next() != BreakIterator.DONE) {
        count++;
    }
    return count;
  }
}
?