質問するログイン新規登録

回答編集履歴

1

回答を追記

2016/07/10 16:11

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

answer CHANGED
@@ -32,4 +32,60 @@
32
32
 
33
33
  ---
34
34
  ちなみに、本回答にあたり`getCharacterInstance`メソッドのソースコードを読んでみようとしましたが、私には理解不可能でした(^^;
35
- [http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/text/BreakIterator.java#BreakIterator.getCharacterInstance%28java.util.Locale%29](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/text/BreakIterator.java#BreakIterator.getCharacterInstance%28java.util.Locale%29)
35
+ [http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/text/BreakIterator.java#BreakIterator.getCharacterInstance%28java.util.Locale%29](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/text/BreakIterator.java#BreakIterator.getCharacterInstance%28java.util.Locale%29)
36
+
37
+ # 2016/07/11 追記
38
+
39
+ 他のものと異なる文字数をカウントするロケールを検出するプログラム。
40
+ `-enableassertions`オプションを付けて実行してください。
41
+ [http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html)
42
+ ```java
43
+ import java.text.BreakIterator;
44
+ import java.util.Collections;
45
+ import java.util.HashMap;
46
+ import java.util.Locale;
47
+ import java.util.Map;
48
+
49
+ public class Main {
50
+
51
+ private static final Map<String, Integer> TESTER;
52
+ static {
53
+ Map<String, Integer> tester = new HashMap<String, Integer>();
54
+ tester.put("Julius Cæsar", 12); // 合字
55
+ tester.put("\u0075\u0308\u0304", 1); // 合字
56
+ tester.put("\u30DB\u309A", 1); // 合字
57
+ tester.put("㍿", 1); // 合字
58
+ tester.put("キャリーパミュパミュ", 12); // 半角カナ
59
+ tester.put("㌦亞䖸丿塔", 5); // 旧字・異字体
60
+ tester.put("कवि की उमंग उल्का मुट्ठी", 14); // ヒンドゥー後
61
+ tester.put(
62
+ "\u05DC\u05B4\u05D4\u05B0\u05D9\u05D5\u05B9\u05EA\u0020\u05E2\u05B7\u05DD\u0020\u05D7\u05B8\u05E4\u05B0\u05E9\u05B4\u05C1\u05D9\u0020\u05D1\u05B0\u05BC\u05D0\u05B7\u05E8\u05B0\u05E6\u05B5\u05E0\u05D5\u05BC\u0020\u05D0\u05B6\u05E8\u05B6\u05E5\u0020\u05E6\u05B4\u05D9\u05BC\u05D5\u05B9\u05DF\u0020\u05D5\u05B4\u05D9\u05E8\u05D5\u05BC\u05E9\u05B8\u05C1\u05DC\u05B7\u05D9\u05B4\u05DD",
63
+ 38); // ヘブライ語、右から読む
64
+
65
+ TESTER = Collections.unmodifiableMap(tester);
66
+ }
67
+
68
+ private static final String ERROR_MESSAGE = "Locale=%s, text=%s, expected=%d, detected=%d";
69
+
70
+ public static void main(String[] args) {
71
+ for (Map.Entry<String, Integer> tester : TESTER.entrySet()) {
72
+ for (Locale locale : Locale.getAvailableLocales()) {
73
+ int count = countCharactor(tester.getKey(), locale);
74
+ assert count == tester.getValue() : String.format(ERROR_MESSAGE,
75
+ locale.toLanguageTag(), tester.getKey(), tester.getValue(), count);
76
+ }
77
+ }
78
+ }
79
+
80
+ private static int countCharactor(String text, Locale locale) {
81
+ BreakIterator iterator = BreakIterator.getCharacterInstance(locale);
82
+ iterator.setText(text);
83
+
84
+ int count = 0;
85
+ while (iterator.next() != BreakIterator.DONE) {
86
+ count++;
87
+ }
88
+ return count;
89
+ }
90
+ }
91
+ ```