也许是我太笨了,这些天来在实际运用中还是未能完全参透版主介绍的按字节来处理的方法
其实我现在试图做的是一个手机短信平台的发送文本框,由于最终的短信内容的长度是 “我做的这个文本框中所输入文本的长度” + “另一块可选择添加的文本长度”,如果我这边的文本超出约定的长度,则另一块在选择添加时有可能出现死循环,为了避免这种循环的出现,我这边必须严格限制输入字符的长度。
由于短信内容中“有中文字符”和“无中文字符”在发送时用的是不同编码 :因为手机短消息的发送是以PDU串的形式发送出去的,中文字符以Unicode码来表示,所以在发送中文短消息之前必须首先将中文字符转换为Unicode码(其中英文字符亦用双字节表示);而在发送不含中文的短信时用的是“7位码”。
因此发送含中文的短信时最多可发送70个字符;而在发送不含中文的短信时最多可发送160个字符(注意:比发送中文短信时的2倍还要多!)。
我的最初想法是:发送前只判断短信内容中“有无中文”及“字符的长度”,发送时再统一编码,这样就只有两个极限:70和160。而如果用字节来处理似乎要更复杂得多。
所以存在的问题就是:
1、 如果我在输入69个中文或159个英文时按回车,虽然我在代码中限制了文本在有中文字符时的最大长度是70和无中文字符时的最大长度是160,但这个回车还是会被输入,即字符数还是会达到71或161,以至超标
2、 如果我输入的“非中文字符”已经超过70个字符,此时我再在后面输入一个中文(或粘贴一段含中文的字符串),原则上是不被允许的,但结果却是如同上面的那个回车一样,还是被输进去(或粘贴上去)了 ,以至超标。
3、 如果我输入的“非中文字符”已经超过70个字符,此时在这前70个“非中文字符”中间随便输入一个中文(或粘贴一段含中文的字符串),这样必然导致字符数超标(为解决这个问题,我的最初想法是简单地截取前70个字符,这样总不至于超标)
这几天我用版主教的方法解决了上述大部份问题,现在只剩下一个回车问题(即在输入69个字符后继续输入的那个回车)无法解决,因为我在代码中是截取前70个字符,而在第69个字符时回车,回车字符所占的两个字符会被截取一个,从而达到70个字符,虽然回车的这半个字符可能对程序影响不大,但总觉得是一个缺限,还望指导一条解决之道。
我用的相关代码如下:
Private Sub text1_Change()
On Error GoTo Doerrors
Dim i As Long
Dim strtemp As String
'判断短信内容及附加信息中是否有中文字符
For i = 1 To (Len(text1.Text) + Len(text2.Text))
strtemp = Mid((text1.Text + text2.Text), i, 1)
If Asc(strtemp) < 0 Then
MaxLength = 70 - Len(text2.Text)
Label1.Caption = "您可以输入70个中文字符,已输入" & (Len(text1.Text) + Len(text2.Text)) & "个字符,其中附加信息占用了" & Len(text2.Text) & "个字符,还可以输入" & (70 - Len(text1.Text) - Len(text2.Text)) & "个字符"
If i <= 70 Then
text1.Text = Left(text1.Text, (70 - Len(text2.Text)))
Exit Sub
End If
'粘帖时防止超长
If MyChangeFlag Then Exit Sub
If Len(text1.Text) > MaxLength Then
MyChangeFlag = True
text1.Text = OldText
text1.SelStart = OldSelStart
MyChangeFlag = False
Else
OldSelStart = text1.SelStart
OldText = text1.Text
End If
Exit Sub
End If
Next
MaxLength = 160 - Len(text2.Text)
Label1.Caption = "您可以输入160个英文字符,已输入" & (Len(text1.Text) + Len(text2.Text)) & "个字符,其中附加信息占用了" & Len(text2.Text) & "个字符,还可以输入" & (160 - Len(text1.Text) - Len(text2.Text)) & "个字符"
'粘帖时防止超长
If MyChangeFlag Then Exit Sub
If Len(text1.Text) > MaxLength Then
MyChangeFlag = True
text1.Text = OldText
text1.SelStart = OldSelStart
MyChangeFlag = False
Else
OldSelStart = text1.SelStart
OldText = text1.Text
End If
Exit Sub
Doerrors:......
End Sub
Private Sub text1_KeyPress(KeyAscii As Integer)
Debug.Print KeyAscii
If KeyAscii <> vbKeyBack Then
If Len(Txt_dxrr.Text) >= MaxLength Then
KeyAscii = 0
End If
End If
End Sub