はじめに
Commons lang の 以下のメソッドは見た目に反して true
を返します。
StringUtils.isAlpha("あ")
いつまでたっても間違いが減らないので、isAlpha
系メソッドは Deprecated
にしてほしいものです。
これは、Character.isAlphabetic(codePoint)
についても同様で、ひらがなや漢字などの大抵の文字に対して true
を返します。
StringUtils の isAlpha 系メソッド
StringUtils には isAlpha 系メソッドがいくつかあります。
StringUtils.isAlpha(final CharSequence cs) StringUtils.isAlphaSpace(final CharSequence cs) StringUtils.isAlphanumeric(final CharSequence cs) StringUtils.isAlphanumericSpace(final CharSequence cs)
例えば isAlpha()
の JavaDoc には以下のようにあり、あたかもアルファベットのみから構成されるかを判定するメソッドのように見えます。
StringUtils.isAlpha(null) = false StringUtils.isAlpha("") = false StringUtils.isAlpha(" ") = false StringUtils.isAlpha("abc") = true StringUtils.isAlpha("ab2c") = false StringUtils.isAlpha("ab-c") = false
でも、これらのメソッドは以下で文字の判定を行っているため、実体はアルファベットではなく Unicode letters かどうかの判定になっています。
Character.isLetter(ch); Character.isLetterOrDigit(ch);
Unicode Letter カテゴリ
Unicode letters は何かと言うと、Character.getType(ch)
で取得できるUnicodeのカテゴリが Letter (L)のものになります(Unicode 16.0 におけるカテゴリ毎の文字数も併記しておきます)。
- Ll: 小文字(Lowercase Letter): 2,258文字
- Lu: 大文字(Uppercase Letter): 1,858文字
- Lt: タイトルケース(Titlecase Letter): 31文字
- Lm: 修飾文字(Modifier Letter): 404文字
- Lo: その他の文字(Other Letter): 136,477文字
Letter (L) は文字を表すもので、これら全てが Character.isLetter(ch)
で true
と判定されます。
例えば「あ」は Other Letter (Lo)
に属するため以下のようになります。
StringUtils.isAlpha("あ") = true
ということで、StringUtils.isAlpha()
はアルファベットかどうかを判定すると思わせつつ、実体は(数字や句読点,記号などを除く)全ての文字が対象になります。
その他のカテゴリを参考として記載しておきます。
- Letter (L): 文字を表します
- Ll: 小文字(Lowercase Letter)
- Lu: 大文字(Uppercase Letter)
- Lt: タイトルケース(Titlecase Letter)
- Lm: 修飾文字(Modifier Letter)
- Lo: その他の文字(Other Letter)
- Mark (M): 文字の上に付加されるマークを表します
- Mn: 非スペーシング結合文字(Nonspacing Mark)
- Mc: スペーシング結合文字(Spacing Combining Mark)
- Me: 囲みマーク(Enclosing Mark)
- Number (N): 数字を表します
- Nd: 10進数字(Decimal Digit)
- Nl: 数字文字(Letter Number)
- No: その他の数字(Other Number)
- Punctuation (P): 句読点を表します
- Pc: コネクタ句読点(Connector Punctuation)
- Pd: ダッシュ句読点(Dash Punctuation)
- Ps: 開き句読点(Open Punctuation)
- Pe: 閉じ句読点(Close Punctuation)
- Pi: 初期引用符(Initial Quote Punctuation)
- Pf: 終了引用符(Final Quote Punctuation)
- Po: その他の句読点(Other Punctuation)
- Symbol (S): 記号を表します
- Sm: 数学記号(Math Symbol)
- Sc: 通貨記号(Currency Symbol)
- Sk: 修飾記号(Modifier Symbol)
- So: その他の記号(Other Symbol)
- Separator (Z): 文字の区切りを表します
- Zs: 空白(Space Separator)
- Zl: 行区切り(Line Separator)
- Zp: 段落区切り(Paragraph Separator)
- Other (C): その他の文字を表します
- Cc: 制御文字(Control Character)
- Cf: 書式文字(Format Character)
- Cs: サロゲート(Surrogate)
- Co: プライベート使用(Private Use)
- Cn: 未割り当て(Not Assigned)