Javaで文字列が全てASCII文字からなるか、
それとも全角の漢字やかなを含んでいるかを知るには、
文字種を識別する
java.lang.Character.UnicodeBlock.of
というメソッドが使えます。
import java.util.*;
import java.lang.Character.UnicodeBlock;
public class Zenhan {
public static void main (String[] args) {
String a = "日本語EUCコードの文字列(2バイト文字も1文字)";
int len = a.length();
System.out.println("長さ=" + String.valueOf(len));
for(int i=0; i<len; i++){
char c = a.charAt(i);
System.out.print("[" + c + "] ");
UnicodeBlock b = UnicodeBlock.of(c);
if(b == UnicodeBlock.BASIC_LATIN){
System.out.println("ASCII文字");
} else if( b == UnicodeBlock.HIRAGANA){
System.out.println("ひらがな");
} else if( b == UnicodeBlock.KATAKANA){
System.out.println("カタカナ");
} else if( b == UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS){
System.out.println("中台日韓統合表意文字(漢字のことっす)");
} else if( b == UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){
System.out.println("半角カナと全角英数");
} else if( b == null){
System.out.println("Javaでは識別できない");
}
}
}
}
|
ところが間の悪いことに、このUnicodeBlockでは、
- 全角の記号(「●」や「〒」など)
が「句読点」「矢印記号」「幾何学的な記号」などたくさんのカテゴリーに分かれているため、
「全角文字のどれか」という識別がしづらい
- 半角カナと全角英数が「使用が推奨されていないもろもろの文字」
という意味の「HALFWIDTH_FULLWIDTH_FORMS」という同じカテゴリになっている
という弱点があります。そこで、半角ASCII、半角カナ、全角文字を識別するには、
現在は
- UTF-8のJava文字列を、シフトJISか日本語EUCのバイトの並びに変換する。
- それらの文字コードの特性から、半角カナや全角文字が含まれるかどうかを調べる
という方法をとる必要があるようです。
/**
* 文字列が半角カナを含んでいたら真を返します。
*/
public static boolean includesHankana (String a) {
byte[] b;
try {
b = a.getBytes("EUC_JP");
} catch(UnsupportedEncodingException ex){ return false; }
for(int i=0; i<b.length; i++){
if(b[i] == -114) return true; // 0x8e
}
return false;
}
/**
* 文字列が全角文字を含んでいたら真を返します。
*/
public static boolean includesMultibytes (String a) {
byte[] b;
try {
b = a.getBytes("EUC_JP");
} catch(UnsupportedEncodingException ex){ return false; }
for(int i=0; i<b.length; i++){
if(b[i] == -114) i++;
else if(b[i] < 0) return true;
// 0x8e以外の0x80ビットが立っている文字があったら当たり
}
return false;
}
|
なお、この文字を「全角」「半角」で分ける考え方は、
中台日韓の極東地域で共通するパソコン文化で、
各国から現状のUnicodeに対する共通の悩みが出ているそうです。
そこでUnicodeもこれに歩み寄るため、新たなコード識別標準が検討されている、
という話もあるようです。
(first uploaded 2001/01/20 last updated 2002/02/17, Urano398)
|