Java

Java6について調べたこと

概要

私のJavaの知識は、「1.4」でほぼ止まってしまっています。
現状を変えるため、少しずつバージョンアップして行こうと思います。

現在、業務で主に触ってたアプリは、「5」で動いていますが、
もともとは「1.4」以前に作られたアプリで、古い記述が残っています。
このアプリのバージョンアップを通して、今回は「6」で追加された機能について調べた事のみを記載します。

調べたこと

Java6は、デスクトップ関連の機能強化多かったのかな?
業務で触ってるアプリで使うことがあるかも?と思った機能2つについて調べました。

Unicodeの正規化

Unicodeの正規化が出来るようになりました。いきなり難しい・・・。

参考:Unicode正規化

Unicode正規化について、下記の4つがある。

種類 概要
NFC 正準等価性に基づく分解後、正準等価性に基づいて再度合成
NFD 正準等価性に基づく分解
NFKC 互換等価性に基づく分解後、正準等価性に基づいて再度合成
NFKD 互換等価性に基づく分解
  • 合成とは
    結合文字列を合成済み文字に変換するような処理

  • 分解とは
    合成済み文字を結合文字列に変換するような処理

  • 結合文字列とは
    複数の文字を組み合わせているけど、1文字で表現される文字列

  • 合成済み文字とは
    「が」「ぎ」「ぐ」など、「か」「き」「く」と濁点(゛)が組み合わさって1文字として表現される文字
    参考:合成済み文字

Unicode正規化のサンプル

  • NFC
System.out.println("1:ハ -> " + Normalizer.normalize("ハ", Normalizer.Form.NFC));
System.out.println("2:バ -> " + Normalizer.normalize("バ", Normalizer.Form.NFC));
System.out.println("3:バ -> " + Normalizer.normalize("バ", Normalizer.Form.NFC));
System.out.println("4:ば -> " + Normalizer.normalize("ば", Normalizer.Form.NFC));
System.out.println("5:パ -> " + Normalizer.normalize("パ", Normalizer.Form.NFC));
System.out.println("6:パ -> " + Normalizer.normalize("パ", Normalizer.Form.NFC));
System.out.println("7:ぱ -> " + Normalizer.normalize("ぱ", Normalizer.Form.NFC));
System.out.println("8:㍉ -> " + Normalizer.normalize("㍉", Normalizer.Form.NFC));
System.out.println("9:① -> " + Normalizer.normalize("①", Normalizer.Form.NFC));

NFC.jpg

  • NFKC
System.out.println("1:ハ -> " + Normalizer.normalize("ハ", Normalizer.Form.NFKC));
System.out.println("2:バ -> " + Normalizer.normalize("バ", Normalizer.Form.NFKC));
System.out.println("3:バ -> " + Normalizer.normalize("バ", Normalizer.Form.NFKC));
System.out.println("4:ば -> " + Normalizer.normalize("ば", Normalizer.Form.NFKC));
System.out.println("5:パ -> " + Normalizer.normalize("パ", Normalizer.Form.NFKC));
System.out.println("6:パ -> " + Normalizer.normalize("パ", Normalizer.Form.NFKC));
System.out.println("7:ぱ -> " + Normalizer.normalize("ぱ", Normalizer.Form.NFKC));
System.out.println("8:㍉ -> " + Normalizer.normalize("㍉", Normalizer.Form.NFKC));
System.out.println("9:① -> " + Normalizer.normalize("①", Normalizer.Form.NFKC));

NFKC.jpg

  • NFD
System.out.println("1:ハ -> " + Normalizer.normalize("ハ", Normalizer.Form.NFD));
System.out.println("2:バ -> " + Normalizer.normalize("バ", Normalizer.Form.NFD));
System.out.println("3:バ -> " + Normalizer.normalize("バ", Normalizer.Form.NFD));
System.out.println("4:ば -> " + Normalizer.normalize("ば", Normalizer.Form.NFD));
System.out.println("5:パ -> " + Normalizer.normalize("パ", Normalizer.Form.NFD));
System.out.println("6:パ -> " + Normalizer.normalize("パ", Normalizer.Form.NFD));
System.out.println("7:ぱ -> " + Normalizer.normalize("ぱ", Normalizer.Form.NFD));
System.out.println("8:㍉ -> " + Normalizer.normalize("㍉", Normalizer.Form.NFD));
System.out.println("9:① -> " + Normalizer.normalize("①", Normalizer.Form.NFD));

NFD.jpg

  • NFKD
System.out.println("1:ハ -> " + Normalizer.normalize("ハ", Normalizer.Form.NFKD));
System.out.println("2:バ -> " + Normalizer.normalize("バ", Normalizer.Form.NFKD));
System.out.println("3:バ -> " + Normalizer.normalize("バ", Normalizer.Form.NFKD));
System.out.println("4:ば -> " + Normalizer.normalize("ば", Normalizer.Form.NFKD));
System.out.println("5:パ -> " + Normalizer.normalize("パ", Normalizer.Form.NFKD));
System.out.println("6:パ -> " + Normalizer.normalize("パ", Normalizer.Form.NFKD));
System.out.println("7:ぱ -> " + Normalizer.normalize("ぱ", Normalizer.Form.NFKD));
System.out.println("8:㍉ -> " + Normalizer.normalize("㍉", Normalizer.Form.NFKD));
System.out.println("9:① -> " + Normalizer.normalize("①", Normalizer.Form.NFKD));

NFKD.jpg

上記のコードを試してみたところ、
NFCは、変換なし。
NFKCは、半角カタカナは全角カタカナ、特殊文字は対応する文字に変換される。
NFDは、半角カタカナは変換なし。濁音(半濁音)は濁点(半濁点)と清音に分割される。特殊文字は変換なし。
NFKDは、半角カタカナは全角カタカナ、濁音(半濁音)は濁点(半濁点)と清音に分割される。特殊文字は対応する文字に変換される。
となりました。

参考:Unicode の正規化

NFKCを用いる事で、半角カナを全角カナに変換する方法に使えそうですが、
気を付けないといけない所もあるみたい。

String before = "ハンカクカナを全角カナに変換シテミル";
String after = Normalizer.normalize(before, Normalizer.Form.NFKC);
System.out.println(before);
System.out.println(after);

Clipboard08.jpg

http://d.hatena.ne.jp/stealthinu/20140826/p1

上記は問題ありませんが、次の場合だと全角円マーク(¥)はそのまま出力されると思っていたのですが、
変換されて出力されました。

String before = "コーヒー牛乳 ¥110";
String after = Normalizer.normalize(before, Normalizer.Form.NFKC);
System.out.println(before);
System.out.println(after);

coffee.jpg

文字コードは下記のようになっています。

before:ff7a ff70 ff8b ff70 725b 4e73 20 ffe5 31 31 30 
after :30b3 30fc 30d2 30fc 725b 4e73 20 a5 31 31 30

半角カナを全角カナに変換する場合、マッピング表みたいなのを作って一致した文字を変換するようなロジックを作った方が良いのかもしれない・・・。

配列のコピー

Arrays.copyOfを使うことで配列のコピーができる。

String[] before = {"コーヒー", "牛乳", "110円"};
String[] after = Arrays.copyOf(before, before.length);
System.out.println("before:" + Arrays.toString(before));
System.out.println("after :" + Arrays.toString(after));
before[0] = "いちご";
after[2] = "150円";
System.out.println("before:" + Arrays.toString(before));
System.out.println("after :" + Arrays.toString(after));
before:[コーヒー, 牛乳, 110円]
after :[コーヒー, 牛乳, 110円]
before:[いちご, 牛乳, 110円]
after :[コーヒー, 牛乳, 150円]

ディープコピーになっています。
ArrysクラスのtoStringは、「1.5」で追加されたメソッドです。


次は、「7」「8」「9」まとめて調べてみようと思ってます。