文字列のひらがな/カタカナをチェックするには?半角、全角など


大幅に修正中、内容は保障されません

http://www.atmarkit.co.jp/fdotnet/dotnettips/054iskana/iskana.html

範囲 名前 説明
0000..007F Basic Latin ラテン語基本 http://unicode.org/charts/PDF/U0000.pdf
2460..24ff Enclosed Alphanumerics 同封英数字、まる1(CIRCLED DIGIT ONE)など http://unicode.org/charts/PDF/U2460.pdf
3040..309F Hiragana 全角ひらがな
30A0..30FF Katakana 全角カタカナ
4E00..9FFF CJK Unified Ideographs 漢字(ほぼ全角?)
FF00..FFEF Halfwidth and Fullwidth Forms 全角ただし、以下のHalfwidth Katakana variants を除く
FF60..FF64 Halfwidth CJK punctuation 半角中国日本韓国句読点 http://unicode.org/charts/PDF/UFF00.pdf
FF65..FF9F Halfwidth Katakana variants 半角カタカナ http://unicode.org/charts/PDF/UFF00.pdf


http://www.unicode.org/Public/UNIDATA/Blocks.txt

# Blocks-4.0.0.txt
# Correlated with Unicode 4.0
# Note: The casing of block names is not normative.
#       For example, "Basic Latin" and "BASIC LATIN" are equivalent.
#
# Code points not explicitly listed in this file are given the value No_Block.
#
# Start Code..End Code; Block Name
〜snip〜
3040..309F; Hiragana
30A0..30FF; Katakana
4E00..9FFF; CJK Unified Ideographs

〜snip〜

動作確認はしていないけど・・・

/**
 * 全部半角かどうか
 */
public static final boolean isHankaku(String str) {
    for (int i = 0, n = str.length(); i < n; i++) {
        char c = str.charAt(i);
        // Basic Latin
        if ('\u0000' <= c && c <= '\u007F') {
            continue ;
        }
        // Halfwidth CJK punctuation
        if ('\uFF60' <= c && c <= '\uFF64') {
            continue ;
        }
        // Halfwidth Katakana variants
        if ('\uFF65' <= c && c <= '\uFF9F') {
            continue ;
        }
        return false; // 半角でない
    }
    return true;
}

以下も作りかけ

  /**
   * 引数の str が type で特定される文字種別で構成された文字列であるかどうかを
   * 返却します。
   * たとえば引数の type に WordValidator.TYPE_NUMERIC が指定された場合、
   * "12345" は true を返却しますが、"12A"は false を返却します。
   * たとえば数字と記号で構成された文字列であるかをチェックしたい場合は、
   * TYPE_NUMERIC | TYPE_SYMBOL のように論理和を type に指定することで
   * 実現できます。
   * 漢字かどうかの判定は<a href="http://www.unicode.org/Public/UNIDATA/Blocks.txt">ここ</a>
   * を参照し、4E00〜9FFF の場合漢字と特定しています。
   * 
   * @param type 許容する文字種別
   * @param str チェック対象の文字列
   * @return str が type で特定される文字種別で構成されている場合 true
   */
  public boolean isMatch(int type, String str) {
    if (str == null || "".equals(str))
      return true;
    for (int i = 0; i < str.length(); i++) {
      char c = str.charAt(i);

      // 半角英字 TYPE_ALPHABET
      if *1(
          continue ;
      }
      // 全角英字 TYPE_WIDE_ALPHABET
      if *2(
          continue ;
      }
      // 半角数字 TYPE_NUMERIC
      if *3
          continue ;
      }
      // 全角記号 TYPE_SYMBOL
      if *4
          continue ;
      }
      // 半角カタカナ TYPE_KATAKANA
      if ((type & TYPE_KATAKANA) == TYPE_KATAKANA) {
        throw new UnsupportedOperationException("TYPE_KATAKANA は未実装です。");
      }
      // 全角カタカナ TYPE_WIDE_KATAKANA
      if ((type & TYPE_WIDE_KATAKANA) == TYPE_WIDE_KATAKANA) {
        if (c >= 'ァ' && c <= 'ヾ')
          continue ;
      }
      // 全角ひらがな TYPE_WIDE_HIRAGANA
      if ((type & TYPE_WIDE_HIRAGANA) == TYPE_WIDE_HIRAGANA) {
        if ((c >= 'ぁ' && c <= 'ゞ') || c == '・' || c == 'ー')
          continue ;
      }
      // 漢字 TYPE_KANJI
      if ((type & TYPE_KANJI) == TYPE_KANJI) {
        if (c >= '\u4E00' && c <= '\u9FA5')
          continue ;
      }
      // どれにも該当しなかった場合
      return false;
    }
    return true;
  }
	/** 半角英字 */
 	public static final int TYPE_ALPHABET      = 0x0001;
 	/** 全角英字 */
	public static final int TYPE_WIDE_ALPHABET = TYPE_ALPHABET << 16;

	/** 半角数字 */
	public static final int TYPE_NUMERIC       = 0x0002;
	/** 全角数字 */
	public static final int TYPE_WIDE_NUMERIC  = TYPE_NUMERIC << 16;

	/** 半角記号 */
	public static final int TYPE_SYMBOL      = 0x0004;
	/** 全角記号 */
	public static final int TYPE_WIDE_SYMBOL = TYPE_SYMBOL << 16;

	/** 半角カタカナ */
	public static final int TYPE_KATAKANA      = 0x0008;
	/** 全角カタカナ */
	public static final int TYPE_WIDE_KATAKANA = TYPE_KATAKANA << 16;

	/** 全角ひらがな */
	public static final int TYPE_WIDE_HIRAGANA = 0x0010 << 16;

	/** 漢字 */
	public static final int TYPE_KANJI = 0x0020 << 16;

	/** 半角英字&半角数字 */
	public static final int TYPE_ALPHANUMERIC = TYPE_ALPHABET & TYPE_NUMERIC;
	/** 半角英字&半角数字&半角記号 */
	public static final int TYPE_ALPHANUMERICSYMBOL= TYPE_ALPHABET & TYPE_NUMERIC & TYPE_SYMBOL;

*1:type & TYPE_ALPHABET) == TYPE_ALPHABET) { if )((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'

*2:type & TYPE_WIDE_ALPHABET) == TYPE_WIDE_ALPHABET) { if )((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'

*3:type & TYPE_NUMERIC) == TYPE_NUMERIC) { if (c >= '0' && c <= '9') continue ; } // 全角数字 TYPE_WIDE_NUMERIC if ((type & TYPE_WIDE_NUMERIC) == TYPE_WIDE_NUMERIC) { if (c >= '0' && c <= '9') continue ; } // 半角記号 TYPE_SYMBOL if ((type & TYPE_SYMBOL) == TYPE_SYMBOL) { if ((c >= '!' && c <= '/') || (c >= ':' && c <= '@') || (c >= '[' && c <= '`') || (c >= '{' && c <= '~'

*4:type & TYPE_WIDE_SYMBOL) == TYPE_WIDE_SYMBOL) { if ((c >= '!' && c <= '/') || (c >= ':' && c <= '@') || (c >= '[' && c <= '`') || (c >= '{' && c <= '〜'