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