isKanjiメソッドを久々に修正した

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

まじめに手直しした。

元のコード

コチラが、元のisKanjiメソッドのコード。

リスト1
Public Function isKanji(ByVal targetCharacter As String) As Boolean
  Dim char As String
  char = targetCharacter
  If Len(char) <> 1 Then Call Err.Raise( _
                                  Number:=10001, _
                                  Description:="引数は1文字のみにしてください。")
  If Asc(char) > 0 Then isKanji = False: Exit Function
  If Asc(char) >= &H889F Then
    isKanji = True
  Else
    isKanji = False
  End If
End Function

うーむ……。実にテキトーである。

これでは、第2水準以降とか、全然対応できないではないか。

で、ちょっとまじめに書き直してみた。

文字コード表は、コチラのお世話になりました。いつもありがとうございます。

書き直したコード

修正したisKanjiメソッドのコードがコチラ。

スト2
Private Function isKanji( _
             ByVal a_Char As String) As Boolean
'///漢字だったらTrueを返す。'
  Const SP_KANJI = "ヽ ヾ ゝ ゞ 〃 仝 々 〆"
  Dim arr() As String
  arr = Split(SP_KANJI)
  isKanji = True
  Dim char As String * 1
  char = a_Char
  Dim i As Long
  '特殊文字は漢字と見なす'
  For i = LBound(arr) To UBound(arr)
    If char = arr(i) Then Exit Function
  Next
  '第4レベルの漢字判定'
  If CInt(Asc(char)) > CInt(&HFC4B) Then
    isKanji = False
    Exit Function
  End If
  If CInt(Asc(char)) > CInt(&HFA5B) Then Exit Function
  '第3レベルの漢字判定'
  If CInt(Asc(char)) > CInt(&HEAA4) Then
    isKanji = False
    Exit Function
  End If
  If CInt(Asc(char)) > CInt(&HE039) Then Exit Function
  '第2レベルの漢字判定'
  If CInt(Asc(char)) > CInt(&H9FFC) Then
    isKanji = False
    Exit Function
  End If
  If CInt(Asc(char)) > CInt(&H989E) Then Exit Function
  '第1レベルの漢字判定'
  If CInt(Asc(char)) > CInt(&H9872) Then
    isKanji = False
    Exit Function
  End If
  If CInt(Asc(char)) > CInt(&H889E) Then Exit Function
  'ここまで引っかからなかったらFalse'
  isKanji = False
End Function

文字コード表とにらめっこしながら、がんばったよ!

使ってみる

次のコードで実験

リスト3
Private Sub test10()
  Dim char As String * 1
  char = "黑"  '……(*)'
  Debug.Print char & " : "; isKanji(char)
End Sub

(*)のところで、変数charに色んな文字を入れてみて実験。

f:id:akashi_keirin:20210619173324p:plain

f:id:akashi_keirin:20210619173320p:plain

うむ。

おわりに

こんなもんでいいのではなかろうか。