字符串中文的问题_visualbasic教程

2008-02-23 05:44:53来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

->字串中文的问题,起於vb的字串是使用UniCode,而我们一般是使用AsciiCode。
这差别在何处呢?UniCode的每个字元长度是2个byte,而Ascii是个byte,假如说,我将们将VB的字串写入档案,有时会有意想不到的结果。例如:
Text1.Text="这是个abc"len5=Len(str5)
假如我们的Access资料库有一栏位的长度是10个Byte,所以我们在TextBox中设定MaxLength=10,但是上面的例子得到的len5是7,而不是我们认为的11,因为不管是中文或英文,vb一律以UniCode来存,所以str5的长度是7个"字元",而text1最大的长度限制是10,7没有超过10,故使用者仍可输入,但存档时,11个byte超过10个byte,所以会有错。
可是或许有人发现,使用RS232来传资料时,另一端主机是Ascii编码的机器,在vb中我们若使用String来传,相同能够通啊,其实那是vb在传送和接收data时,会做转换,使我们的程式设计较方便,但假如传的资料是Binary时,就头大啦。例如说,以字串的方式来传送资料,当想传Ascii大於128时,常有些问题,因为ASC(Chr(129))=0,使我们不能用Chr()的指令来放资料。(事实上,您能够使用ChrW(129)来存资料,和使用AscW()来取得值,加个W代表是Word的运算),这时候,就只有使用ByteArray来做了。1.UniCode转成ByteAryDimbyteAry()AsByteDimstr5AsStringDimiAsLongstr5="这abc"
byteAry=str5Fori=LBound(byteAry)ToUBound(byteAry)
Debug.PrintbyteAry(i)得25144970980990Nexti
Debug.PrintLen(str5),LenB(str5)得48
所以了,可看出UniCode的特性,程式应改一下,使用Strconv()来转换DimbyteAry()AsByte
Dimstr5AsStringDimiAsLongstr5="这abc"
byteAry=StrConv(str5,vbFromUnicode)
Fori=LBound(byteAry)ToUBound(byteAry)
Debug.PrintbyteAry(i)得25144979899Nexti
Debug.PrintLenB(StrConv(str5,vbFromUnicode))得5
2.ByteAry转回UniCode使用Strconv()转换DimbyteAry(10)asByteDimStr5asString
byteAry(0)=25byteAry(1)=144byteAry(2)=97byteAry(3)=98
byteAry(4)=99Str5=StrConv(byteAry,vbUniCode)3.一些有用的函式SubStr()中文化取子字串,相对Mid()
Strlen()中文化字串长度,相对Len()
StrLeft()中文化取左字串,相对Left()
StrRight()中文化取右字串,相对Right()
isChinese()Check某个字是否中文字

PublicFunctionSubStr(ByValtstrAsString,startAsInteger,OptionallengAsVariant)AsString
DimtmpstrAsString
IfIsMissing(leng)Then
tmpstr=StrConv(MidB(StrConv(tstr,vbFromUnicode),start),vbUnicode)
Else
tmpstr=StrConv(MidB(StrConv(tstr,vbFromUnicode),start,leng),vbUnicode)
EndIf
SubStr=tmpstr
EndFunction

PublicFunctionStrlen(ByValtstrAsString)AsInteger
Strlen=LenB(StrConv(tstr,vbFromUnicode))
EndFunction

PublicFunctionStrLeft(ByValstr5AsString,ByVallen5AsLong)AsString
DimtmpstrAsString
tmpstr=StrConv(str5,vbFromUnicode)
tmpstr=LeftB(tmpstr,len5)
StrLeft=StrConv(tmpstr,vbUnicode)
EndFunction

PublicFunctionStrRight(ByValstr5AsString,ByVallen5AsLong)AsString
DimtmpstrAsString
tmpstr=StrConv(str5,vbFromUnicode)
tmpstr=RightB(tmpstr,len5)
StrLeft=StrConv(tmpstr,vbUnicode)
EndFunction

PublicFunctionisChinese(ByValasciivAsInteger)AsBoolean
IfLen(Hex$(asciiv))>2Then
isChinese=True
Else
isChinese=False
EndIf
EndFunction->
->


标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 选择 vb.net 还是 c# ? _c#应用

下一篇: 关于c#的问答_c#教程