文字が漢字かどうかを判定するFunction
文字が漢字かどうかを判定するFunction
漢字かどうかの判定
文字が漢字かどうかを判定するロジックを考えた。
画像の出典はコチラのサイトっす。
Shift_JISの文字コード表を見ると、漢字は 889F以降に割り当てられているっぽい。
16進数の889Fってのは、
この通り、10進数だと-30561。
んで、次の88A0は
この通り、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メソッドを実行してみた結果が
コチラ。
ちゃんと期待した結果が得られた。
おわりに
ただ、コンピュータに詳しい人なら一瞬で気づいたと思いますけど、このFunctionには少なくとも1つ、重大な欠陥があるのです。そのあたりは次回……。
でも、そんなことはともかく、このFunctionの使いどころって、何なのでしょうねえ……?
追記
ちなみに、上記の「重大な欠陥」は、
コチラで修正してあります。