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

2.2.2 取得字符串的某种编码形式

对上例略加修改,得到下例。

getStringGBKFormat.asp

<%
text = "今天下雪了。"
result = ""

'输出字符长度
response.write "字符长度:" & Len(text) & "<br>"

'循环每一个字符
For i=1 To Len(text)
    oneByte = Mid(text, i,1)        '得到一个字符
    number = Asc(oneByte)           '该字符对应的数字
    numberHex = Hex(number)         '数字的十六进制形式

    '如果十六进制形式只有一位,则前面补一个0
    If Len(numberHex) = 1 Then
            numberHex = "0" & numberHex
    End If

    '拼接结果
    result = result & " " & numberHex
Next
response.write result '输出结果
%>

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

图2-5 字符串的某种编码形式

输出的是几个字符的GBK编码,而非内存存储形式。将程序中的Asc函数换为AscW函数,得到另一个示例getStringUnicodeFormat.asp。

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

该例输出的是几个字符的Unicode编码。对照变量的内存存储形式,可以发现,每个字符的两个字节顺序是相反的。如“今”字的内存存储形式是“CA 4E”,而该例输出的是“4E CA”。这是为什么呢?其实还是字节顺序的问题。“今”字的Unicode编码其实就是“4E CA”,其中“4E”是高字节,“CA”是低字节,内存变量采用的是Little Endian方式,所以是“CA 4E”。

图2-6 字符串的Unicode编码形式

简单总结一下,涉及字节操作的时候(如使用LenB、MidB、LeftB等函数),才需要考虑变量的内存存储形式。如果只是字符操作,那么在字符这一层面考虑即可,Asc等函数会屏蔽掉字节顺序的问题,返回正确的结果。