半角カナと全角文字の認識

 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、半角カナ、全角文字を識別するには、 現在は
  1. UTF-8のJava文字列を、シフトJISか日本語EUCのバイトの並びに変換する。
  2. それらの文字コードの特性から、半角カナや全角文字が含まれるかどうかを調べる
という方法をとる必要があるようです。

    /**
     * 文字列が半角カナを含んでいたら真を返します。
     */
    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もこれに歩み寄るため、新たなコード識別標準が検討されている、 という話もあるようです。

Java kowaza Top

(first uploaded 2001/01/20 last updated 2002/02/17, Urano398)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル