Scripts 学盟
标题:
VBScript 中的 Asc, AscB, AscW
[打印本页]
作者:
Alvin
时间:
2011-4-26 22:26:16
标题:
VBScript 中的 Asc, AscB, AscW
Asc, AscB, AscW 这三个函数大家都见过,但有什么区别呢。。
扯一扯吧, 首先是 Asc, Asc 是按本地字符集取文字的编码数值
SetLocale "zh-CN"
MsgBox Asc("轻") ' -14367
复制代码
为什么是负数呢,呵呵,其实在 GBK 集中,“轻”字对印的编码是二个字节: C7 E1
即是二进制的:11000111 11100001
因为首位是1, 被当成有符号数了,
那怎么才能取得无符号数的值呢,嘿嘿,加上65536便成。
所以一般呢取得字符的本地编码值,可以这么样 (Asc("盟") + 65536) Mod 65536
再来看一下
SetLocale "zh-TW"
MsgBox Asc("轻") ' 63
复制代码
咦,怎么是 63, 63 是ascii 字符中的 "?" 问号啊,为什么呢。。。。
呵呵,因为 SetLocale "zh-TW" 之后,使用的是台湾地区的字符集,对应的是 Big5 码
台湾地区使用的是繁体字,有木有 有木有
繁体字里头可没有 "轻" 这个字符哦。。。。 所以搞了个 "?" 来
要不知道的话,可真悲催了。。伤不起啊,伤不起....
SetLocale "zh-TW"
MsgBox Asc("輕") ' -17484
复制代码
这下行了吧。嘿嘿
再来看一下 AscB, AscB 也可以取得 Ascii 字符的编码值,但是对于多字节字符,只取得第一个字节的值
MsgBox AscB("轻") ' 123, 对吧 “轻”的Unicode编码是 8F 7B 两个字节,而 7B 转换成十进制就是 123
MsgBox AscB(MidB("轻", 2, 1)) ' 143, 对吧 “轻”的Unicode编码是 8F 7B 两个字节,而 8f 转换成十进制就是 143
复制代码
为什么是 Unicode 编码的呢。。。。呵呵, VBScript 运行时,字符在内存中都是 Unicode 表示的
那又为什么
AscB("轻") 是 7B
AscB(MidB("轻", 2, 1)) 反而是 8F 呢。。。。
因为运行时,一个字符在内存中的 Unicode 表示,有的是高位在前,有的是低位在前,这个是平台决定的
为什么会有的是高位在前,有的是低位在前。。。。
我也不知道。。。
够悲催的了,我们别再纠结了。。。
还有就是 AscW, AscW 取得字符的 Unicode 编码
MsgBox AscW("轻") ' -28805
MsgBox Hex(AscW("轻")) ' 8F7B ' 不用再说了吧... 哈哈
复制代码
作者:
Yisin
时间:
2011-5-1 18:48:35
说的真搞
欢迎光临 Scripts 学盟 (http://www.iscripts.org/)
Powered by Discuz! X2