文字が漢字かどうかを判定するFunction

文字が漢字かどうかを判定するFunction

漢字かどうかの判定

文字が漢字かどうかを判定するロジックを考えた。

f:id:akashi_keirin:20171209172058j:plain

f:id:akashi_keirin:20171209172119j:plain

画像の出典はコチラのサイトっす。

Shift_JIS文字コード表を見ると、漢字は 889F以降に割り当てられているっぽい。

16進数の889Fってのは、

f:id:akashi_keirin:20171209172142j:plain

この通り、10進数だと-30561

んで、次の88A0

f:id:akashi_keirin:20171209172217j:plain

この通り、10進数だと-30560になる。

ということは、文字コード889F、すなわち-30561以上だったら漢字ということだ。

コーディング

以上を踏まえてコーディングする。

リスト1 標準モジュール
Public Function isKanji(ByVal targetCharacter As String) As Boolean
  Dim char As String
  char = targetCharacter    '……(1)'
  If Len(char) <> 1 Then _
      Err.Raise Number:=10001, _
                Description:="引数は1文字のみにしてください。"    '……(2)'
  If Asc(char) >= &H889F Then    '……(3)'
    isKanji = True
  Else
    isKanji = False
  End If
End Function

(1)の

char = targetCharacter

では、引数targetCharacterで受け取った文字(列)を変数charにぶち込んでいる。別にこんなことしなくても良いのだけれど、引数名を「targetCharacter」と長い名前にしたので、そのまま使ったら1行が長くなるから。ただそれだけのこと。自作関数やメソッドの引数名をなるべく説明的に付けようと最近決心しただけです。

(2)の3行(実質1行)

If Len(char) <> 1 Then _
    Err.Raise Number:=10001, _
              Description:="引数は1文字のみにしてください。"

はガード節。そもそも1文字について漢字かどうか判定したいので、引数に複数文字の文字列を与えられたら困る。だからエラーを吐く仕様にした。

いつも、自作エラーの番号は10001とかテキトーかつ投げやりな番号にしているんだけれど、こういうのもコーディング規約的に決めておいたほうがいいんですかね?

メインの処理は(3)からの5行

If Asc(char) >= &H889F Then
  isKanji = True
Else
  isKanji = False
End If

Asc関数で文字コードの数字が得られるので、それを16進数の889Fと比較して、889F以上だったらTrue、未満だったらFalseを返すようにした。

実行結果

イミディエイト・ウインドウで

?isKanji("亜")

など、文字コード表先頭の漢字「亜」を皮切りにいくつかの2バイト文字を引数にしてisKanjiメソッドを実行してみた結果が

f:id:akashi_keirin:20171209172250j:plain

コチラ。

ちゃんと期待した結果が得られた。

おわりに

ただ、コンピュータに詳しい人なら一瞬で気づいたと思いますけど、このFunctionには少なくとも1つ、重大な欠陥があるのです。そのあたりは次回……。

でも、そんなことはともかく、このFunctionの使いどころって、何なのでしょうねえ……?

@akashi_keirin on Twitter

追記

ちなみに、上記の「重大な欠陥」は、

akashi-keirin.hatenablog.com

コチラで修正してあります。