界面上面的文本框,有些要求只能输入8位半角字符的长度,有些要求只能输入5位全角字符的长度。
用len()的话好像不能区分输入的究竟是半角还是全角,谁有办法解决这个问题吗?

解决方案 »

  1.   

    http://www.mndsoft.com/blog/article.asp?id=1171
      

  2.   

    找到了一个方法判断输入的字符是全角还是半角。
    如:
    a是全角的,asc("a")是负值
    a是半角的,asc("a")是正值但是比较麻烦的是,现在要一个字符一个字符的判断文本框中输入的字符串是否均为全角或均为半角,再用len()判断长度是否为指定的长度,很麻烦啊。
    或者是先用len()判断长度再去判断输入的字符串里的每个字符是否为均为全角还是均为半角,但是也比较麻烦啊。谁有些简洁的写法。
      

  3.   

    Private Function WhatChar(ByVal vStr As String) As Integer
        Dim gbascii As Byte
        Dim intChar As Integer
        If Asc(vStr) < 0 Then
            gbascii = AscB(StrConv(vStr, vbFromUnicode))
            '区位码在16区之后的为汉字
            If gbascii - 160 > 15 Then
                intChar = 0 ' "是汉字"
            Else
                intChar = 2 ' "是全角符号"
            End If
        Else
            intChar = 1 ' "是半角英文或数字"
        End If
        WhatChar = intChar
    End Function
      

  4.   

    楼上的这个也不错。不过也得把字符一个个用mid()函数取出来判断。我现在用在文本框中。比如我要判断text1里输入的内容是否为5位的全角字符。要判断5次。
      

  5.   

    Option ExplicitPrivate Sub Text1_Validate(Cancel As Boolean)
        Dim lLenUnicode As Long
        Dim lLenAnsi As Long
        
        lLenUnicode = Len(Text1)
        lLenAnsi = LenB(StrConv(Text1, vbFromUnicode))
        
        If (lLenUnicode > 8) Or (lLenUnicode <> lLenAnsi) Then
            MsgBox "只能输入8位半角字符!", vbExclamation
            Cancel = True
        End If
    End SubPrivate Sub Text2_Validate(Cancel As Boolean)
        Dim lLenUnicode As Long
        Dim lLenAnsi As Long
        
        lLenUnicode = Len(Text2)
        lLenAnsi = LenB(StrConv(Text2, vbFromUnicode))
        
        If (lLenUnicode > 5) Or ((lLenUnicode * 2) <> lLenAnsi) Then
            MsgBox "只能输入5位全角字符!", vbExclamation
            Cancel = True
        End If
    End Sub
      

  6.   

    '------------------------------------------------------------------------------------------------------
    '
    ' キャラクターチェック
    1(半角)、2(全角)、3(混在)、4(空白)、5(Null)、9(其他)'------------------------------------------------------------------------------------------------------
    Function Chk_Char(p_char, p_Rc) As Integer
    Dim i As Integer
    Dim char_len As Integer
    Dim chk_len As Integer
    Dim asc_code As Integer
        On Error GoTo Chk_Char_Err
            
        Chk_Char = -1
        p_Rc = -1    If IsNull(p_char) = True Then
    '      Null
            p_Rc = 5
            Chk_Char = 0
            Exit Function
        End If
        
        char_len = Len(Trim(p_char))
        If char_len = 0 Then
    '      空白
            p_Rc = 4
            Chk_Char = 0
            Exit Function
        End If
        chk_len = 0
        For i = 1 To char_len
            asc_code = Asc(Mid(Trim(p_char), i, 1))
            If 0 <= asc_code And asc_code <= 255 Then
               chk_len = chk_len + 1
            Else
               chk_len = chk_len + 2
            End If
        Next i
        Select Case chk_len
        Case char_len
    '         ASCII
           p_Rc = 1
        Case (char_len * 2)
    '         (漢字)
           p_Rc = 2
        Case char_len To (char_len * 2)
    '         混在
           p_Rc = 3
        Case Else
    '         其他
           p_Rc = 9
        End Select
        
        Chk_Char = 0
        
        Exit Function
    Chk_Char_Err:
        MsgBox Err & " " & Error & Chr(13) & Chr(10) & "ErrPlace = Chk_Char", vbOKOnly
    End Function
      

  7.   

    贴的不好,重贴下'------------------------------------------------------------------------------------------------------
    '
    ' キャラクターチェック
    '
    ' 引数:文字列、リターンコード
    ' 戻値:0(正常)、-1(エラー)
    ' リターンコード:-1(エラー)、1(半角)、2(全角)、3(混在)、4(空白)、5(Null)、9(その他)
    '
    '
    ' 作成日:2000/11/17 sakaguchi
    '
    '------------------------------------------------------------------------------------------------------
    Function Chk_Char(p_char, p_Rc) As Integer
    Dim i As Integer
    Dim char_len As Integer
    Dim chk_len As Integer
    Dim asc_code As Integer
        On Error GoTo Chk_Char_Err
            
        Chk_Char = -1
        p_Rc = -1    If IsNull(p_char) = True Then
    '      Null
            p_Rc = 5
            Chk_Char = 0
            Exit Function
        End If
        
        char_len = Len(Trim(p_char))
        If char_len = 0 Then
    '      空白
            p_Rc = 4
            Chk_Char = 0
            Exit Function
        End If
        chk_len = 0
        For i = 1 To char_len
            asc_code = Asc(Mid(Trim(p_char), i, 1))
            If 0 <= asc_code And asc_code <= 255 Then
               chk_len = chk_len + 1
            Else
               chk_len = chk_len + 2
            End If
        Next i
        Select Case chk_len
        Case char_len
    '         ASCII
           p_Rc = 1
        Case (char_len * 2)
    '         シフトJIS(漢字)
           p_Rc = 2
        Case char_len To (char_len * 2)
    '         混在
           p_Rc = 3
        Case Else
    '         その他
           p_Rc = 9
        End Select
        
        Chk_Char = 0
        
        Exit Function
    Chk_Char_Err:
        MsgBox Err & " " & Error & Chr(13) & Chr(10) & "ErrPlace = Chk_Char", vbOKOnly
    End Function
      

  8.   

    简单的方法是用Len和API函数lstrlen一起判断,Len和lstrlen返回一样的话全部是半角的,Len比lstrlen返回小说明有全角字符
      

  9.   

    Len返回是lstrlen的1/2说明全部字符是全角,除此之外Len比lstrlen返回小说明既有全角字符也有半角字符
      

  10.   

    半角是ASCII编码,占一个字节;LenB函数可以取得一个字符串所占用的字节数。
    全角是UniCode编码,占二个字节;Len函数可以取得一个字符串所占的字数。简单的说:Len("A")=LenB("A") Len("汉")>LenB("汉")。
    判断字符串是半角的还是非半角的方法就是比较LenB和Len的返回值。
    如果Len=LenB,那么这个字符串是半角的。
    如果2*Len=LenB,那么这个字符串是全角的。
    如果Len<LenB<2*Len,那么这个字符串中既含有半角字符又含有全角字符。
      

  11.   

    哦,上面错了,忘了VB是UNICODE编码的
      

  12.   

    ?LenB(strconv("a",vbFromUnicode))
    2
    ?LenB(strconv("a",vbFromUnicode))
    1
      

  13.   

    ?LenB(strconv("啊1",vbFromUnicode))
    3