*Java:ICUを使ってみた [#v5945071]
ICUとは、「International Components for Unicode」で、ユニコード文字列を変換するライブラリみたいなものです。
ひらがな→ローマ字とかローマ字→ひらがな、大文字、小文字とか半角、全角とかが、日本語⇔英語以外でもできるすぐれもの、っぽいですw
以下のリンクよりダウンロードできます。
-http://site.icu-project.org/download
とりあえず、執筆時点での最新であるICU4J 50.1をダウンロードして試してみました。
ただ動かすだけであれば以下のファイルのみで動きます。
-icu4j-50_1.jar
***使った感触 [#odc2bf2e]
ヘボン式で変換したかったんだけど、出し方がわからず。
実際には、geonames.orgで公開している時空間情報の市区町村名(ローマ字表記)を照合したいって話で試行錯誤中。
geonames.orgのデータはこちらから。海外のサービスってところが面白いかもしれないところ。実際に入っているデータも、日本人が整備したわけではないデータで、いろいろ面白いところ有りですw
-http://www.geonames.org/
-http://download.geonames.org/export/dump/
ここから、JPってやつをDLすれば手に入ります。
実際のデータを読み→ローマ字で照合のがよいか、ローマ字→ひらがなで照合するのがよいか、試してみたらちょっと悩みますね。
最初は「漢字→ひらがな→ローマ字」に変換して、ローマ字表記のデータと照合したほうが良いかと思ったけど、案外「ローマ字→ひらがな」で照合したほうが良いかも。
***サンプル [#v5131c27]
以下、サンプルです。
ソースコード
-icutest.TestICU.java
-resources/icu/cityname.txt
以下、ソースコードのハードコピーですw
package icutest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Enumeration;
import com.ibm.icu.text.Transliterator;
public class TestICU {
public static void main(String args[]) {
// 使用可能なIDリストを標準出力。
// printAvailableIDs();
// 単体変換のサンプル。
// String src = "おううち";
// String src2 = "sendai-shi";
// transliteratorTest(src);
// transliteratorTest(src2);
// 外部ファイルを変換元として、一括して変換し標準出力する。
String id = "Latin-Hiragana";
transCityNames(id);
}
/**
* goenamesのJPをDLしたものの3カラム目を抜いたテキストをインプットとして、
* 引数のIDで変換して標準出力に出力。
* */
private static final void transCityNames(String id) {
try {
File file = new File("./resources/icu/cityname.txt");
BufferedReader br = new BufferedReader(new FileReader(file));
String str;
while ((str = br.readLine()) != null) {
//System.out.println(str);
testTransliterator(str, id);
}
br.close();
} catch (FileNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
}
/**
* 変換元の文字列、IDを引数として、IDで変換した値を標準出力。
* */
private static final void testTransliterator(String src, String id) {
Transliterator tr1 = Transliterator.getInstance(id);
System.out.println(src + "→(" + id + ")→" + tr1.transliterate(src));
}
/**
* 気になるIDを適当に指定して入力値をIDをもとに変換し標準出力。w
* */
private static final void test(String src) {
Transliterator tr1 = Transliterator.getInstance("JapaneseKana-Latin/BGN");
System.out.println(src + "→(JapaneseKana-Latin/BGN)→" + tr1.transliterate(src));
Transliterator tr2 = Transliterator.getInstance("Hiragana-Latin");
System.out.println(src + "→(Hiragana-Latin)→" + tr2.transliterate(src));
Transliterator tr3 = Transliterator.getInstance("ja_Latn-ko");
System.out.println(src + "→(ja_Latn-ko)→" + tr3.transliterate(src));
Transliterator tr4 = Transliterator.getInstance("ja_Latn-ru");
System.out.println(src + "→(ja_Latn-ru)→" + tr4.transliterate(src));
Transliterator tr5 = Transliterator.getInstance("Any-katakana");
System.out.println(src + "→(Any-katakana)→" + tr5.transliterate(src));
}
/**
* 使用可能なa system transliterator IDを標準出力に出力。
* */
private static final void printAvailableIDs() {
Enumeration e = Transliterator.getAvailableIDs();
String tmp = "";
while (e.hasMoreElements()) {
System.out.println(e.nextElement().toString());
}
}
/**
* 使用可能なIDを使用して、入力と出力が異なるIDの場合に変換値を出力。
* */
private static final void transliteratorTest(String src) {
Enumeration e = Transliterator.getAvailableIDs();
String id = "";
String tmp = "";
while (e.hasMoreElements()) {
id = e.nextElement().toString();
Transliterator tr = Transliterator.getInstance(id);
tmp = tr.transliterate(src);
if (!src.contentEquals(tmp)) {
System.out.println(src + "→(" + id + ")→" + tmp);
}
}
}
}
続いて、出力サンプルです。
Bekkai-cho→(Latin-Hiragana)→べっかい-ちょ
Atsuma-cho→(Latin-Hiragana)→あつま-ちょ
Ashoro-mura→(Latin-Hiragana)→あしょろ-むら
Ashoro-cho→(Latin-Hiragana)→あしょろ-ちょ
Aseishi-mura→(Latin-Hiragana)→あせいし-むら
Arasawa-mura→(Latin-Hiragana)→あらさわ-むら
Akan-cho→(Latin-Hiragana)→あかん-ちょ
Abashiri-shicho→(Latin-Hiragana)→あばしり-しちょ
Kitauwa-gun→(Latin-Hiragana)→きたうわ-ぐん
Kamiukena-gun→(Latin-Hiragana)→かみうけな-ぐん
Shisui-machiyakuba→(Latin-Hiragana)→しすい-まちやくば
Nonoichi-machiyakuba→(Latin-Hiragana)→ののいち-まちやくば
Saza-choyakuba→(Latin-Hiragana)→さざ-ちょやくば
[[awkについて]]