文字列のひらがな/カタカナをチェックするには?半角、全角など
大幅に修正中、内容は保障されません
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 <= '〜'