上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等函数会屏蔽掉字节顺序的问题,返回正确的结果。