ICU4J

otsuka氏のblobのエントリー"続・ICU4J"のコメントを今後の為にまとめておく。

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

import junit.framework.TestCase;

import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.DateFormatSymbols;
import com.ibm.icu.text.Transliterator;
import com.ibm.icu.text.Normalizer;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.util.JapaneseCalendar;

public class Icu4jTests extends TestCase {

        public void testG2J() {
                // 西暦→和暦
                JapaneseCalendar jc = new JapaneseCalendar();
                DateFormatSymbols dfs = new DateFormatSymbols(jc, Locale.JAPANESE);
                DateFormat df = new SimpleDateFormat("Gy年M月d日", dfs);
                df.setCalendar(jc);
                Date d1 = new GregorianCalendar(2004, 0, 1).getTime();
                assertEquals("平成16年1月1日", df.format(d1));
                Date d2 = new GregorianCalendar(1868, 11, 31).getTime();
                assertEquals("明治1年12月31日", df.format(d2));
                Date d3 = new GregorianCalendar(1989, 0, 7).getTime();
                assertEquals("1989年1月7日までは昭和", "昭和64年1月7日", df.format(d3));
                Date d4 = new GregorianCalendar(1989, 0, 8).getTime();
                assertEquals("1989年1月8日からは平成", "平成1年1月8日", df.format(d4));
        }

        public void testJ2G() {
                // 和暦→西暦
                DateFormat df = new SimpleDateFormat ("yyyy-MM-dd");
                Date d1 = new JapaneseCalendar(JapaneseCalendar.HEISEI, 16, 0, 1).getTime();
                assertEquals("2004-01-01",df.format(d1));
                Date d2 = new JapaneseCalendar(JapaneseCalendar.MEIJI, 1, 11, 31).getTime();
                assertEquals("1868-12-31",df.format(d2));
                Date d3 = new JapaneseCalendar(JapaneseCalendar.SHOWA, 64, 0, 7).getTime();
                assertEquals("1989-01-07",df.format(d3));
                Date d4 = new JapaneseCalendar(JapaneseCalendar.HEISEI, 1, 0, 8).getTime();
                assertEquals("1989-01-08",df.format(d4));
                // 有りえないけど
                Date d5 = new JapaneseCalendar(JapaneseCalendar.HEISEI, 1, 0, 7).getTime();
                assertEquals("1989-01-07",df.format(d5));
        }

        public void testTransliterator() { 
                Transliterator t1 = Transliterator.getInstance("Hiragana-Katakana");
                assertEquals("ヒラガナカタカナカタカナ", t1.transliterate("ひらがなカタカナカタカナ"));
                Transliterator t2 = Transliterator.getInstance("Katakana-Hiragana");
                assertEquals("ひらがなかたかなかたかな", t2.transliterate("ひらがなカタカナカタカナ"));
                Transliterator t3 = Transliterator.getInstance("Hiragana-Latin");
                assertEquals("hiraganaカタカナカタカナ", t3.transliterate("ひらがなカタカナカタカナ"));
                Transliterator t4 = Transliterator.getInstance("Latin-Hiragana");
                assertEquals("あるふぁべっと", t4.transliterate("arufabetto"));
                Transliterator t5 = Transliterator.getInstance("Katakana-Latin");
                assertEquals("ひらがなkatakanakatakana", t5.transliterate("ひらがなカタカナカタカナ"));
                Transliterator t6 = Transliterator.getInstance("Latin-Katakana");
                assertEquals("アルファベット", t6.transliterate("arufabetto"));
                Transliterator.getAvailableIDs();
        }

        public void testNormalizer() {
                assertEquals("カタカナ", "カタカナ", Normalizer.normalize("カタカナ", Normalizer.NFKC, 0));
                assertEquals("数字", "123", Normalizer.normalize("123", Normalizer.NFKC, 0));
                assertEquals("アルファベット", "ABCD", Normalizer.normalize("ABCD", Normalizer.NFKC, 0));
                assertEquals("機種依存", "X10TELミリ", Normalizer.normalize("Ⅹ⑩℡㍉", Normalizer.NFKC, 0));

                // Windowsでの文字〜がUnicodeの0x301Cに変換されないことが原因らしい
                // javaのUnicodeに変換された〜を0x301Cに置き換えて
                // ノーマライズ後、0x301Cを〜に置き換える処理を付けるといいらしい
                assertEquals("〜は~に変換される", "~", Normalizer.normalize("〜", Normalizer.NFKC, 0));

                assertEquals("カタカナ~123ABCD", Normalizer.normalize("カタカナ〜123ABCD", Normalizer.NFKC, 0));
        }

        public static void assertEquals(String expected, String actual) {
                assertEquals((Object) expected, actual);
        }

        public static void assertEquals(String message, String expected, String actual) {
                assertEquals(message, (Object) expected, actual);
        }

        public Icu4jTests(String name) {
                super(name);
        }

}