2012年8月20日月曜日

Javaで全角・半角の判定

Javaで全角か半角の判定をしてみる.

�.2バイトかそれ以外かによる判定
 全角:バイト数が2バイトの文字
 半角:バイト数が1バイトの文字
この違いを活かした判別方法.

コード
private void method1(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (String.valueOf(chars[i]).getBytes().length < 2) {
System.out.print("半");
} else {
System.out.print("全");
}
}
}

参考サイト
◇JAVA Servlet での全角文字判定

�.Unicodeで判定する
Javaにおいては文字列は全てUNICODEで表現される
 ⇒ 全角半角の判定も各文字のUNICODEで判断する

Unicode表 Unicode(ユニコード)一覧検索 & 逆引き検索「うにこ〜ど2」 を参照



コード
private void method2(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if ((c <= '\u007e') || // 英数字
(c == '\u00a5') || // \記号
(c == '\u203e') || // ~記号
(c >= '\uff61' && c <= '\uff9f') // 半角カナ
) {
System.out.print("半");
} else {
System.out.print("全");
}
}
}

備考
識別する文字の前後の含みも入れている

参考サイト
◇JavaのString中の全角半角の判定


�.全部全角の文字列かそれ以外かの判定
�.の方法と同じで,文字列全体を検査しているところが違う

コード
private boolean method3(String s) {
byte[] bytes = s.getBytes();
if (s.length() != bytes.length) {
// 半角混入
return true;
} else {
// 全角のみ
return false;
}
}

参考サイト
◇Java String 全角半角を含む文字列の扱い

�.URLEncoderクラス
URLEncoderクラスを利用した判定方法.

コード
@SuppressWarnings("deprecation")
private void method4(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
String temp = String.valueOf(chars[i]);
if (URLEncoder.encode(temp).length() < 4) {
System.out.print("半");
} else {
System.out.print("全");
}
}
}
備考
「メソッド encode(String) は型 URLEncoder で使用すべきではありません」ってでるけど問題なし

参考サイト
◇プログラマメモ2

これらを比較してみる
上に挙げた4つの動作が同じであるか「"全角han漢字\\~〜カナ"」という引数を与えて確かめてみた.
結果は
全全半半半全全半半全全全 // �
全全半半半全全半半全半半 // �
true // �
全全半半半全全半半全全全 // �
であった.
方法�.と�.では半角カナを判別できなかった.
これより,方法�が最も精度がいいといえる.

全方法の比較ソース
package isZenHan;

import java.net.URLEncoder;

public class isZenHan {

public static void main(String[] args) {
isZenHan z = new isZenHan();
z.method1("全角han漢字\\~〜カナ");
System.out.println();
z.method2("全角han漢字\\~〜カナ");
System.out.println(z.method3("全角han漢字\\~〜カナ"));
System.out.println();
z.method4("全角han漢字\\~〜カナ");
}

// 全全半半半全全半半全全全
private void method1(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
if (String.valueOf(chars[i]).getBytes().length < 2) {
System.out.print("半");
} else {
System.out.print("全");
}
}
}

// 全全半半半全全半半全半半
private void method2(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if ((c <= '\u007e') || // 英数字
(c == '\u00a5') || // \記号
(c == '\u203e') || // ~記号
(c >= '\uff61' && c <= '\uff9f') // 半角カナ
) {
System.out.print("半");
} else {
System.out.print("全");
}
}
}

// true
private boolean method3(String s) {
byte[] bytes = s.getBytes();
if (s.length() != bytes.length) {
// 半角混入
return true;
} else {
// 全角のみ
return false;
}
}

// 全全半半半全全半半全全全
@SuppressWarnings("deprecation")
private void method4(String s) {
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
String temp = String.valueOf(chars[i]);
if (URLEncoder.encode(temp).length() < 4) {
System.out.print("半");
} else {
System.out.print("全");
}
}
}
}