|
字符串中文的问题
发表日期:2006-2-27
|
->字串中文的问题,起於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-> ->
|
|
上一篇:使VB的网格控件具有输入功能
人气:4201
下一篇:字符串中包含双引号
人气:4594 |
浏览全部Visual Basic的内容
Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐
|
|