回答編集履歴

1

回答を追記

2016/07/10 16:11

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -67,3 +67,115 @@
67
67
  ちなみに、本回答にあたり`getCharacterInstance`メソッドのソースコードを読んでみようとしましたが、私には理解不可能でした(^^;
68
68
 
69
69
  [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)
70
+
71
+
72
+
73
+ # 2016/07/11 追記
74
+
75
+
76
+
77
+ 他のものと異なる文字数をカウントするロケールを検出するプログラム。
78
+
79
+ `-enableassertions`オプションを付けて実行してください。
80
+
81
+ [http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html)
82
+
83
+ ```java
84
+
85
+ import java.text.BreakIterator;
86
+
87
+ import java.util.Collections;
88
+
89
+ import java.util.HashMap;
90
+
91
+ import java.util.Locale;
92
+
93
+ import java.util.Map;
94
+
95
+
96
+
97
+ public class Main {
98
+
99
+
100
+
101
+ private static final Map<String, Integer> TESTER;
102
+
103
+ static {
104
+
105
+ Map<String, Integer> tester = new HashMap<String, Integer>();
106
+
107
+ tester.put("Julius Cæsar", 12); // 合字
108
+
109
+ tester.put("\u0075\u0308\u0304", 1); // 合字
110
+
111
+ tester.put("\u30DB\u309A", 1); // 合字
112
+
113
+ tester.put("㍿", 1); // 合字
114
+
115
+ tester.put("キャリーパミュパミュ", 12); // 半角カナ
116
+
117
+ tester.put("㌦亞䖸丿塔", 5); // 旧字・異字体
118
+
119
+ tester.put("कवि की उमंग उल्का मुट्ठी", 14); // ヒンドゥー後
120
+
121
+ tester.put(
122
+
123
+ "\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",
124
+
125
+ 38); // ヘブライ語、右から読む
126
+
127
+
128
+
129
+ TESTER = Collections.unmodifiableMap(tester);
130
+
131
+ }
132
+
133
+
134
+
135
+ private static final String ERROR_MESSAGE = "Locale=%s, text=%s, expected=%d, detected=%d";
136
+
137
+
138
+
139
+ public static void main(String[] args) {
140
+
141
+ for (Map.Entry<String, Integer> tester : TESTER.entrySet()) {
142
+
143
+ for (Locale locale : Locale.getAvailableLocales()) {
144
+
145
+ int count = countCharactor(tester.getKey(), locale);
146
+
147
+ assert count == tester.getValue() : String.format(ERROR_MESSAGE,
148
+
149
+ locale.toLanguageTag(), tester.getKey(), tester.getValue(), count);
150
+
151
+ }
152
+
153
+ }
154
+
155
+ }
156
+
157
+
158
+
159
+ private static int countCharactor(String text, Locale locale) {
160
+
161
+ BreakIterator iterator = BreakIterator.getCharacterInstance(locale);
162
+
163
+ iterator.setText(text);
164
+
165
+
166
+
167
+ int count = 0;
168
+
169
+ while (iterator.next() != BreakIterator.DONE) {
170
+
171
+ count++;
172
+
173
+ }
174
+
175
+ return count;
176
+
177
+ }
178
+
179
+ }
180
+
181
+ ```