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

chengxu1020 2009-10-13 09:02:06
界面上面的文本框,有些要求只能输入8位半角字符的长度,有些要求只能输入5位全角字符的长度。
用len()的话好像不能区分输入的究竟是半角还是全角,谁有办法解决这个问题吗?
...全文
896 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)
js代码 [removed] //显示限制输入字符method function textAreaChange(obj){ var $this = $(obj); var count_total = $this.next().children('span').text(); var count_input = $this.next().children('em'); var area_val = $this.val(); if(area_val.len()>count_total){ area_val = autoAddEllipsis(area_val,count_total);//根据字节截图内容 $this.val(area_val); count_input.text(0);//显示可输入数 }else{ count_input.text(count_total - area_val.len());//显示可输入数 } } //得到字符串的字节长度 String.prototype.len = function(){ return this.replace(/[^\x00-\xff]/g, "xx").length; }; /* * 处理过长的字符串,截取并添加省略号 * 注:半角长度为1,全角长度为2 * pStr:字符串 * pLen:截取长度 * return: 截取后的字符串 */ function autoAddEllipsis(pStr, pLen) { var _ret = cutString(pStr, pLen); var _cutFlag = _ret.cutflag; var _cutStringn = _ret.cutstring; return _cutStringn; } /* * 取得指定长度的字符串 * 注:半角长度为1,全角长度为2 * pStr:字符串 * pLen:截取长度 * return: 截取后的字符串 */ function cutString(pStr, pLen) { // 原字符串长度 var _strLen = pStr.length; var _tmpCode; var _cutString; // 默认情况下,返回的字符串是原字符串的一部分 var _cutFlag = "1"; var _lenCount = 0; var _ret = false; if (_strLen <= pLen/2){_cutString = pStr;_ret = true;} if (!_ret){ for (var i = 0; i < _strLen ; i ){ if (isFull(pStr.charAt(i))){_lenCount = 2;} else {_lenCount = 1;} if (_lenCount > pLen){_cutString = pStr.substring(0, i);_ret = true;break;} else if(_lenCount == pLen){_cutString = pStr.substring(0, i 1);_ret = true;break;} } } if (!_ret){_cutString = pStr;_ret = true;} if (_cutString.length == _strLen){_cutFlag = "0";} return {"cutstring":_cutString, "cutflag":_cutFlag}; } /* * 判断是否为全角 * * pChar:长度为1的字符串 * return: true:全角 * false:半角 */ function isFull (pChar){ if((pChar.charCodeAt(0) > 128)){return true;} else{return false;} } [removed] jQuery textarea文本框输入文字字数限制提示代码,设置固定输入字符,实时计算显示已经输入多少字符。

7,785

社区成员

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

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