字符串中文的问题
2006-02-27 11:41:27 来源:WEB开发网
核心提示:->字串中文的问题,起於vb的字串是使用UniCode,字符串中文的问题,而我们一般是使用AsciiCode,这差别在何处呢?UniCode的每个字元长度是2个byte,相对Mid()Strlen()中文化字串长度,相对Len()StrLeft()中文化取左字串,而Ascii是一个byte,如果说
->字串中文的问题,起於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->
->