深入解析ASP核心技术
上QQ阅读APP看书,第一时间看更新

2.2.4 BSTR转换为字符串

从BSTR转换为字符串,就是将上例的过程反过来。首先,应该以字节为单位处理BSTR,读取一个字节数据后,使用AscB函数取得该字节数据对应的数字,然后用Chr函数转换为字符,此时,该字符就是Unicode编码形式的内存变量了。

稍微难点的地方还是汉字等多字节字符的处理。取得一个字节的数据后,如何知道这个字节是一个英数字,还是汉字的一部分呢?如果是后者,那么应该再读取后面的一个字节,将这两个字节组合起来,然后使用Asc函数取得数字。

那么如何判断呢?下面就简单介绍一下。

英数字的编码是小于255的,更确切一点说,是小于128的,而128~255这段范围是提供给各种编码自己扩充的。某些语言的编码会在这段范围内直接填充字符,因为它们语言中的字符用255个表示已经足够了,而对于汉字来说,这么做是不行的,因为255个实在是太少了。

一个汉字需要用两个字节来表示,为了避免单个字节与英数字混淆,每个字节都是大于128的。即在简体中文的编码中,如果一个字节是小于128的,那么它对应的是英数字;如果是大于128的,那么表示这个字节与之后的那个字节是一起表示一个汉字的。不存在单个字节大于128却单独表示一个字符的情况,128~255这段范围(即一个字节的最高位是1)是纯粹作为汉字的前导标识而存在的。那么,相信大家已经知道该如何做了。

下面看一下范例。

BStr2String.asp

……
'前面接上例的String转换为BSTR,这里省略了

'从BSTR转换为字符串
For i=1 To LenB(result)
    oneByte = MidB(result, i,1)      '得到一个字节
    number = AscB(oneByte)           '字节对应的数字

    '大于127,说明是汉字,特殊处理一下
    If number>127 Then
            numberLow = AscB(MidB(result, i+1,1))  '取得后面一个字节
            number = number * 256 + numberLow     '计算两个字节对应数值,高位*256即可
            i=i+1                    '下次循环跳过后面那个字节
    End If

    '输出每个字符的解析结果
    response.write "<span style='width:50px; border:1px solid; margin:5px'>"
    response.write Hex(number) & "<br>" & chr(number) & "</span>"
Next

运行结果如图2-8所示。

图2-8 BSTR转换为字符串

从以上范例可以看出,字符串与BSTR的相互转换需要了解很多知识,处理很多细节问题,比较烦琐。下文会介绍Adodb.Stream组件,它在编码转换方面的能力比较强大,而且容易使用。