如何判断文本框里输入的全角半角?

chengxu1020 2009-10-13 09:02:06
界面上面的文本框,有些要求只能输入8位半角字符的长度,有些要求只能输入5位全角字符的长度。
用len()的话好像不能区分输入的究竟是半角还是全角,谁有办法解决这个问题吗?
...全文
844 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
贝隆 2009-10-13
  • 打赏
  • 举报
回复
哦,上面错了,忘了VB是UNICODE编码的。。。
贝隆 2009-10-13
  • 打赏
  • 举报
回复
半角是ASCII编码,占一个字节;LenB函数可以取得一个字符串所占用的字节数。
全角是UniCode编码,占二个字节;Len函数可以取得一个字符串所占的字数。

简单的说:Len("A")=LenB("A") Len("汉")>LenB("汉")。
判断字符串是半角的还是非半角的方法就是比较LenB和Len的返回值。
如果Len=LenB,那么这个字符串是半角的。
如果2*Len=LenB,那么这个字符串是全角的。
如果Len<LenB<2*Len,那么这个字符串中既含有半角字符又含有全角字符。
ltpao 2009-10-13
  • 打赏
  • 举报
回复
Len返回是lstrlen的1/2说明全部字符是全角,除此之外Len比lstrlen返回小说明既有全角字符也有半角字符
ltpao 2009-10-13
  • 打赏
  • 举报
回复
简单的方法是用Len和API函数lstrlen一起判断,Len和lstrlen返回一样的话全部是半角的,Len比lstrlen返回小说明有全角字符
ArmStronger 2009-10-13
  • 打赏
  • 举报
回复
贴的不好,重贴下

'------------------------------------------------------------------------------------------------------
'
' キャラクターチェック
'
' 引数:文字列、リターンコード
' 戻値: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
ArmStronger 2009-10-13
  • 打赏
  • 举报
回复
'------------------------------------------------------------------------------------------------------
'
' キャラクターチェック
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
Tiger_Zhao 2009-10-13
  • 打赏
  • 举报
回复
Option Explicit

Private 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 Sub

Private 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
chengxu1020 2009-10-13
  • 打赏
  • 举报
回复
楼上的这个也不错。不过也得把字符一个个用mid()函数取出来判断。我现在用在文本框中。比如我要判断text1里输入的内容是否为5位的全角字符。要判断5次。
king06 2009-10-13
  • 打赏
  • 举报
回复
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
X800329 2009-10-13
  • 打赏
  • 举报
回复
看看就好!
pusiyu 2009-10-13
  • 打赏
  • 举报
回复
下载,竟然说我积分不够,如何是好啊???
chengxu1020 2009-10-13
  • 打赏
  • 举报
回复
找到了一个方法判断输入的字符是全角还是半角。
如:
a是全角的,asc("a")是负值
a是半角的,asc("a")是正值

但是比较麻烦的是,现在要一个字符一个字符的判断文本框中输入的字符串是否均为全角或均为半角,再用len()判断长度是否为指定的长度,很麻烦啊。
或者是先用len()判断长度再去判断输入的字符串里的每个字符是否为均为全角还是均为半角,但是也比较麻烦啊。

谁有些简洁的写法。
chengxu1020 2009-10-13
  • 打赏
  • 举报
回复
楼上提供的代码不错
但是却没有关于全角半角的问题
dingyanwei 2009-10-13
  • 打赏
  • 举报
回复
http://www.mndsoft.com/blog/article.asp?id=1171
chengxu1020 2009-10-13
  • 打赏
  • 举报
回复
谢谢大家啦!
特别 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tiger_zhao 的回复:]
VB codeOptionExplicitPrivateSub Text1_Validate(CancelAsBoolean)Dim lLenUnicodeAsLongDim lLenAnsiAsLong

lLenUnicode=Len(Text1)
lLenAnsi= LenB(StrConv(Text1, vbFromUnicode))If (lLenUnicode>8)Or (lLenUnicode<> lLenAnsi)Then
MsgBox"只能输入8位半角字符!", vbExclamation
Cancel=TrueEndIfEnd SubPrivateSub Text2_Validate(CancelAsBoolean)Dim lLenUnicodeAsLongDim lLenAnsiAsLong

lLenUnicode=Len(Text2)
lLenAnsi= LenB(StrConv(Text2, vbFromUnicode))If (lLenUnicode>5)Or ((lLenUnicode*2)<> lLenAnsi)Then
MsgBox"只能输入5位全角字符!", vbExclamation
Cancel=TrueEndIfEnd Sub
[/Quote]
严重同意
赵4老师 2009-10-13
  • 打赏
  • 举报
回复
?LenB(strconv("啊1",vbFromUnicode))
3
赵4老师 2009-10-13
  • 打赏
  • 举报
回复
?LenB(strconv("a",vbFromUnicode))
2
?LenB(strconv("a",vbFromUnicode))
1
m60a1 2009-10-13
  • 打赏
  • 举报
回复
判断ASCII码
chengxu1020 2009-10-13
  • 打赏
  • 举报
回复
感谢大家
我正在试用8楼代码的方法
加载更多回复(1)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧