上QQ阅读APP看书,第一时间看更新
2.2.3 字符串转换为BSTR
看到BSTR,就应该想到ChrB函数,想到ChrB,就应该想到Asc和AscB,然后就是如何对字符串进行拆分的问题了。如果按字节拆分,那么得到的是每个字符的Unicode编码的形式,如果按字符拆分,则得到当前所用编码的形式。因为我们的目标是BSTR,所以按字节拆分就没有意义了,因为先AscB然后再ChrB,是个圈,得到的东西和原来一样。所以,一般转为BSTR都是按字符拆分,然后用Asc配合ChrB使用。
ChrB的参数要求是0~255,而Asc返回的范围要大得多。如果字符串中的每个字符都是英数字,那么没有问题,它们的编码数字都是小于255的。如果出现了汉字或其他编码数字大于255的字符,那么就需要对编码数字进行拆分了,拆分为两个字节即可。如“啊”字的编码十六进制形式是B0 A1,那么拆分为B0和A1即可。
看一下范例。
String2BStr.asp
<% text = "今天下雪了o(0_0)o" result = "" '输出字符长度 response.write "字符长度:" & Len(text) & "<br>" '循环每一个字符 For i=1 To Len(text) oneChar = Mid(text, i,1) '得到一个字符
number = Asc(oneChar) '该字符对应的数字 numberHex = Hex(number) '数字的十六进制形式 If Len(numberHex)>2 Then '汉字等,十六进制形式大于两位,即大于FF,如BDF1 hexHigh = Left(numberHex,2) '高字节,如BD hexLow = right(numberHex,2) '低字节,如F1 result = result & ChrB("&H" & hexHigh) & ChrB("&H" & hexLow) '拼接结果 Else '英数字等 result = result & ChrB("&H" & numberHex) '拼接结果 End If Next response.write "字符串内存形式:" & getMemoryFormat(text) & "<br>" response.write "转换为BSTR形式:" & getMemoryFormat(result) & "<br>" response.write "输出字符串形式:" & text & "<br>" response.write "输出BSTR形式:" & result '得到字符串的内存存储形式 Function getMemoryFormat(bstr) Dim result, i For i=1 To Lenb(bstr) numberHex = Hex(AscB(MidB(bstr, i,1))) If Len(numberHex) = 1 Then numberHex = "0" & numberHex End If result = result & " " & numberHex Next getMemoryFormat = result End Function %>
运行结果如图2-7所示。
图2-7 字符串转换为BSTR
从结果可以看出BSTR形式与内存形式的不同,对于汉字来说,编码是不同的,对于英数字来说,在BSTR形式中,每个字符只需占用一个字节。
字符串转换为BSTR,概括起来理解,就是Unicode编码到某种编码的转换。