回答編集履歴
1
回答を追記
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
|
+
```
|