vb unicode

我们知道,在VB中,有一种Byte数据类型。每个Byte型变量占一个字节,不含符号位,因此所能表示的范围为0到255。这种数据类型是专门用于存放二进制数据的。由于Byte是一种简单数据类型,因此字节数组的传递是非常简单的。首先,需要把一个字符串正确地转变成一个字节数组。这要涉及一些字符集的知识。Windows 95和VB使用不同的字符集,Windows 95 API使用的是ANSI或DBCS 字符集,而VB使用的则是Unicode字符集。所谓ANSI字符集,是指每个字符都用一个字节表示, 因此最多只能有28=256个不同的字符,这对于英语来说已经足够了,但不能完全支持其它语 言。DBCS字符集支持很多不同的东亚语言,如汉语、日语和朝鲜语,它使用数字0-255表示ASCII 字符,其它大于255或小于0的数字表明该字符属于非拉丁字符集;在DBCS中,ASCII字符的长 度是一个字节,而汉语、日语和其它东亚字符的长度是2个字节。而Unicode字符集则完全用 两个字节表示一个字符,因此最多可以表示216=65536个不同字符。也就是说,ANSI字符集中所有的字符都只占一个字节,DBCS字符集中ASCII字符占一个字节,汉字占两个字节,Unicode字符集中每个字符都占两个字节。由于VB与WindowsAPI使用的字符集不同,因此在进行字符串到字节数组的转换时,当用Asc函数取得一个字符的字节码后,需要判断它是否是一个ASCII 字符;如果是ASCII字符,则在转换后的字节数组中就只占一个字节,否则要占两个字节。

  下面给出了转换函数:GetCharByte得到一个字符的高字节或低字节,它的第一个参数是一个字符的ASCII码,第二个参数是标志取高字节还是低字节;StrToByte按DBCS或ANSI格 式将一个字符串转换成一个字节数组,第一个参数是待转换的字符串,第二个参数是转换后的一个定长字节数组,若该数组长度不足以存放整个字符串,则截去超长的部分;ChangeStrAryToByte 利用前两个函数将字符串数组转换成字节数组,第一个参数是定长的字符串数组,其中每个元素都是一个字符串(各个元素包含的字符数可以不同),第二个参数是一个变长的字节数组, 保存转换后的结果。

   Function GetCharByte(ByVal OneChar As Integer, ByVal IsHighByte As Boolean) As Byte ' 该函数获得一个字符的高字节或低字节 If IsHighByte ThenIf OneChar >= 0 ThenGetCharByte = CByte(OneChar / 256) '右移8位,得到高字节ElseGetCharByte = CByte((OneCharAnd &H7FFF) / 256) Or &H80End IfExit FunctionElseGetCharByte = CByte(OneChar And &HFF) '屏蔽掉高字节,得到低字节Exit FunctionEnd IfEnd FunctionSub StrToByte(StrToChange As String, ByteArray() As Byte)'该函数将一个字符串转换成字节数组Dim LowBound, UpBound As IntegerDim i, count, length As IntegerDim OneChar As Integercount = 0length = Len(StrToChange)LowBound = LBound(ByteArray)UpBound = UBound(ByteArray)For i = LowBound To UpBoundByteArray(i) = 0 '初始化字节数组NextFor i = LowBound To UpBoundcount = count + 1If count <= length ThenOneChar = Asc(Mid(StrToChange, count, 1))If (OneChar > 255) Or (OneChar < 0) Then'该字符是非ASCII字符ByteArray(i) = GetCharByte(OneChar, True) '得到高字节i = i + 1If i <= UpBound Then ByteArray(i)= GetCharByte(OneChar, False)'得到低字节Else'该字符是ASCII字符ByteArray(i) = OneCharEnd IfElseExit ForEnd IfNextEnd SubSub ChangeStrAryToByte(StrAry()As String, ByteAry() As Byte)'将字符串数组转换成字节数组Dim LowBound, UpBound As IntegerDim i, count, StartPos, MaxLen As IntegerDim TmpByte() As ByteLowBound = LBound(StrAry)UpBound = UBound(StrAry)count = 0ReDim ByteAry(0)For i = LowBound To UpBoundMaxLen = LenB(StrAry(i))ReDim TmpByte(MaxLen + 1)ReDim Preserve ByteAry(count + MaxLen + 1)Call StrToByte(StrAry(i), TmpByte) '转换一个字符串StartPos = countDoByteAry(count) = TmpByte(count - StartPos)count = count + 1If ByteAry(count - 1) = 0 Then Exit DoLoop '将每一个字符串对应的字节数组按顺序填入结果数组中ReDim Preserve ByteAry(count - 1)Next iEnd Sub

  下面看一个转换的例子:
DimResultAry()asByteDimSomeStr(2)asStringSomeStr(0)="测试1"SomeStr(1)="测试222"SomeStr(2)="测试33"CallChangeStrAryToByte(SomeStr,ResultAry)'转换字符串数组

  当转换完成以后,查看字节数组ResultAry,其中包含了21个元素,依次是:178,226,202,212,49,0,178,226,202,212,50,50,50,0,178,226,202,212,51,51,0。其中,[178,226]是"测"的字节码,[202,112]是"试"的字节码,49,50,51 分别为字符1、2、3的ASCII码。可见,经过转换后,字符串数组中的各个元素按顺序放在了字节数组中,相互间以终止符0分隔。

  这样,字符串数组就全部转换成了字节数组,然后只要将字节数组的第一个元素以传址的方式传入动态连接库,DLL过程就可以正确地访问数组中的所有字符串了。但是,使用这种方法,当DLL过程处理结束返回VB时,VB得到的仍然是字节数组。如果需要在VB中再次得到该字节数组表示的字符串,还要把整个字节数组重新以0为分割符分成多个子数组(每个子数组都对应原来字符串数组中的一个元素),然后使用VB函数StrConv将每个子数组转换成字符串(转换时第二个参数选vbUnicode),就可以显示或进行其它操作了。例如,其中一个子数组的名字是SubAry,则函数StrConv(SubAry,vbUnicode)就返回了它所对应的字符串。

例子:

Function GetCharByte(ByVal OneChar As Integer, ByVal IsHighByte As Boolean) As Byte ' 该函数获得一个字符的高字节或低字节

If IsHighByte Then
If OneChar >= 0 Then
GetCharByte = CByte(OneChar / 256)
'右移8位,得到高字节
Else
GetCharByte = CByte((OneChar
And &H7FFF) / 256) Or &H80
End If
Exit Function
Else
GetCharByte = CByte(OneChar And &HFF)
'屏蔽掉高字节,得到低字节
Exit Function
End If
End Function

Sub StrToByte(StrToChange As String, ByteArray() As Byte)
'该函数将一个字符串转换成字节数组
Dim LowBound, UpBound As Integer
Dim i, count, length As Integer
Dim OneChar As Integer

count = 0
length = Len(StrToChange)
LowBound = LBound(ByteArray)
UpBound = UBound(ByteArray)

For i = LowBound To UpBound
ByteArray(i) = 0 '初始化字节数组
Next

For i = LowBound To UpBound
count = count + 1
If count <= length Then
OneChar = Asc(Mid(StrToChange, count, 1))

If (OneChar > 255) Or (OneChar < 0) Then
'该字符是非ASCII字符
ByteArray(i) = GetCharByte(OneChar, True) '得到高字节
i = i + 1
If i <= UpBound Then ByteArray(i)
= GetCharByte(OneChar, False)
'得到低字节
Else
'该字符是ASCII字符
ByteArray(i) = OneChar
End If
Else
Exit For
End If
Next
End Sub

Sub ChangeStrAryToByte(StrAry()
As String, ByteAry() As Byte)
'将字符串数组转换成字节数组
Dim LowBound, UpBound As Integer
Dim i, count, StartPos, MaxLen As Integer
Dim TmpByte() As Byte

LowBound = LBound(StrAry)
UpBound = UBound(StrAry)
count = 0
ReDim ByteAry(0)

For i = LowBound To UpBound
MaxLen = LenB(StrAry(i))
ReDim TmpByte(MaxLen + 1)
ReDim Preserve ByteAry(count + MaxLen + 1)
Call StrToByte(StrAry(i), TmpByte) '转换一个字符串
StartPos = count
Do
ByteAry(count) = TmpByte(count - StartPos)
count = count + 1
If ByteAry(count - 1) = 0 Then Exit Do
Loop '将每一个字符串对应
的字节数组按顺序填入结果数组中
ReDim Preserve ByteAry(count - 1)
Next i
End Sub 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值