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); } }