上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组件,它在编码转换方面的能力比较强大,而且容易使用。