深入解析ASP核心技术
上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编码到某种编码的转换。