如何在VB6中模拟C#char.IsLetter

How to simulate C# char.IsLetter in VB6

我对 MSDN 关于 char.IsLetter 的描述不太满意。我不太明白。 从常识上看,Letter是:A-Z,a-z,Unicode string... 经我测试,“~!@#$%^...”和0-9不属于IsLetter范畴。是啊,范围很大,如何在VB6中模拟C#char.IsLetter(写类似的代码)?

像这样的东西应该可以做到,这是 question

的部分答案
Private Function IsLetter(ByVal character As String) As Boolean
    IsLetter = UCase$(character) <> LCase$(character)
End Function

Option Explicit

Private Declare Function IsCharAlphaW Lib "user32" (ByVal cChar As Integer) As Long
Private Declare Function IsCharAlphaNumericW Lib "user32" (ByVal cChar As Integer) As Long

Public Property Get IsAlpha(character As String) As Boolean
    IsAlpha = IsCharAlphaW(AscW(character))
End Property

Public Property Get IsAlphaNumeric(character As String) As Boolean
    IsAlphaNumeric = IsCharAlphaNumericW(AscW(character))
End Property

Public Property Get IsNumeric(character As String) As Boolean
    IsNumeric = IsAlphaNumeric(character) And Not IsAlpha(character)
End Property

Private Sub Form_Load()
   Debug.Print "a", IsAlpha("a")
   Debug.Print "Z", IsAlpha("Z")
   Debug.Print "0", IsAlpha("0"), IsNumeric("0")
   Debug.Print "ChrW$(&HFF21)", IsAlpha(ChrW$(&HFF21))
   Debug.Print "ChrW$(&HFF10)", IsAlpha(ChrW$(&HFF10)), IsNumeric(ChrW$(&HFF10))
End Sub

这对我有用,但我做了一个非常快速的测试。它使用 User32.dll API 调用 IsCharAlphaW,它应该在 Windows 2000 Professional 及更高版本上可用。试试看,如果不对,我会删除答案,这样就不会混淆任何人。

注意:示例中没有错误处理。

Private Declare Function IsCharAlpha Lib "user32" Alias "IsCharAlphaW" (ByVal cChar As Long) As Long

Private Sub Command1_Click()

    MsgBox "IsLetter(" & Text1.Text & ") = " & IsLetter(Left$(Text1.Text, 1))

End Sub

Private Function IsLetter(ByVal vCharacter As String) As Boolean

    IsLetter = IsCharAlpha(AscW(vCharacter))

End Function

Option Explicit

Private Declare Function IsCharAlphaW Lib "user32" (ByVal cChar As Integer) As Long
Private Declare Function IsCharAlphaNumericW Lib "user32" (ByVal cChar As Integer) As Long

Public Property Get IsAlpha(character As String) As Boolean
    IsAlpha = IsCharAlphaW(AscW(character))
End Property

Public Property Get IsAlphaNumeric(character As String) As Boolean
    IsAlphaNumeric = IsCharAlphaNumericW(AscW(character))
End Property

Public Property Get IsNumeric(character As String) As Boolean
    IsNumeric = IsAlphaNumeric(character) And Not IsAlpha(character)
End Property

Private Sub Form_Load()
   Debug.Print "a", IsAlpha("a")
   Debug.Print "Z", IsAlpha("Z")
   Debug.Print "0", IsAlpha("0"), IsNumeric("0")
   Debug.Print "ChrW$(&HFF21)", IsAlpha(ChrW$(&HFF21))
   Debug.Print "ChrW$(&HFF10)", IsAlpha(ChrW$(&HFF10)), IsNumeric(ChrW$(&HFF10))
End Sub

根据 Unicode 标准,这会告诉您什么是字符。

Public Const CT_CTYPE1 = &H1         '  ctype 1 information
Public Const CT_CTYPE2 = &H2         '  ctype 2 information
Public Const CT_CTYPE3 = &H4         '  ctype 3 information
Public Const C1_ALPHA = &H100   '  any letter
Public Const C1_BLANK = &H40    '  blank characters
Public Const C1_CNTRL = &H20    '  control characters
Public Const C1_DIGIT = &H4     '  decimal digits
Public Const C1_LOWER = &H2     '  lower case
Public Const C1_PUNCT = &H10    '  punctuation characters
Public Const C1_SPACE = &H8     '  spacing characters
Public Const C1_TRANSPARENT = &H1     '  new raster cap
Public Const C1_UPPER = &H1     '  upper case
Public Const C1_XDIGIT = &H80    '  hex digits
Public Const C1_DEFINED = &H200    '  Other defined char

Public Const C2_ARABICNUMBER = &H6     '  Arabic number
Public Const C2_BLOCKSEPARATOR = &H8     '  block separator
Public Const C2_COMMONSEPARATOR = &H7     '  common numeric separator
Public Const C2_EUROPENUMBER = &H3     '  European number, digit
Public Const C2_EUROPESEPARATOR = &H4     '  European numeric separator
Public Const C2_EUROPETERMINATOR = &H5     '  European numeric terminator
Public Const C2_LEFTTORIGHT = &H1     '  left to right
Public Const C2_NOTAPPLICABLE = &H0     '  no implicit directionality
Public Const C2_OTHERNEUTRAL = &HB     '  other neutrals
Public Const C2_RIGHTTOLEFT = &H2     '  right to left
Public Const C2_WHITESPACE = &HA     '  white space
Public Const C2_SEGMENTSEPARATOR = &H9     '  segment separator
Public Const C3_DIACRITIC = &H2     '  diacritic mark
Public Const C3_NONSPACING = &H1     '  nonspacing character
Public Const C3_NOTAPPLICABLE = &H0     '  ctype 3 is not applicable
Public Const C3_SYMBOL = &H8     '  symbols
Public Const C3_VOWELMARK = &H4     '  vowel mark

Function GetC1Type(B As String) As String
        Dim Ret As Long
        Dim A() As Integer
        ReDim A(1)
        A(0) = 0
        A(1) = 0
        Ret = GetStringTypeEx(&HB, CT_CTYPE1, B, -1, A(0))
        Dim Alpha As Long
        Dim Blank As Long
        Dim Cntrl As Long
        Dim Digit As Long
        Dim LowerC As Long
        Dim UpperC As Long
        Dim Punct As Long
        Dim SpaceChar As Long
        Dim HexDigit As Long
        Dim DefinedChar As Long
        Dim CharTypeString
        Dim X As Long
        Alpha = A(0) And C1_ALPHA
        Blank = A(0) And C1_BLANK
        Cntrl = A(0) And C1_CNTRL
        Digit = A(0) And C1_DIGIT
        LowerC = A(0) And C1_LOWER
        UpperC = A(0) And C1_UPPER
        Punct = A(0) And C1_PUNCT
        SpaceChar = A(0) And C1_SPACE
        HexDigit = A(0) And C1_XDIGIT
        DefinedChar = A(0) And C1_DEFINED
        If Alpha = C1_ALPHA Then CharTypeString = CharTypeString & "Alpha "
        If Blank = C1_BLANK Then CharTypeString = CharTypeString & "Blank "
        If Cntrl = C1_CNTRL Then CharTypeString = CharTypeString & "Control "
        If Digit = C1_DIGIT Then CharTypeString = CharTypeString & "Number "
        If LowerC = C1_LOWER Then CharTypeString = CharTypeString & "Lower "
        If UpperC = C1_UPPER Then CharTypeString = CharTypeString & "Upper "
        If Punct = C1_PUNCT Then CharTypeString = CharTypeString & "Punct "
        If SpaceChar = C1_SPACE Then CharTypeString = CharTypeString & "Space "
        If Len(CharTypeString) = 0 Then
            If DefinedChar = C1_DEFINED Then CharTypeString = CharTypeString & "Other_Defined "
            If Len(CharTypeString) = 0 Then CharTypeString = CharTypeString & "Not_Defined "
        End If
        GetC1Type = CharTypeString
End Function