Scripts 学盟

标题: VBScript 中的 Asc, AscB, AscW [打印本页]

作者: Alvin    时间: 2011-4-26 22:26:16     标题: VBScript 中的 Asc, AscB, AscW

Asc, AscB, AscW 这三个函数大家都见过,但有什么区别呢。。


扯一扯吧, 首先是 Asc,  Asc 是按本地字符集取文字的编码数值
  1. SetLocale "zh-CN"
  2. MsgBox Asc("轻")   ' -14367
复制代码
为什么是负数呢,呵呵,其实在 GBK 集中,“轻”字对印的编码是二个字节: C7 E1
即是二进制的:11000111 11100001
因为首位是1, 被当成有符号数了,
那怎么才能取得无符号数的值呢,嘿嘿,加上65536便成。
所以一般呢取得字符的本地编码值,可以这么样  (Asc("盟") + 65536) Mod 65536

再来看一下
  1. SetLocale "zh-TW"
  2. MsgBox Asc("轻")   ' 63
复制代码
咦,怎么是 63,  63 是ascii 字符中的 "?" 问号啊,为什么呢。。。。
呵呵,因为 SetLocale "zh-TW" 之后,使用的是台湾地区的字符集,对应的是 Big5 码
台湾地区使用的是繁体字,有木有 有木有

繁体字里头可没有 "轻" 这个字符哦。。。。 所以搞了个 "?" 来
要不知道的话,可真悲催了。。伤不起啊,伤不起....
  1. SetLocale "zh-TW"
  2. MsgBox Asc("輕")   ' -17484
复制代码
这下行了吧。嘿嘿



再来看一下 AscB, AscB 也可以取得 Ascii 字符的编码值,但是对于多字节字符,只取得第一个字节的值
  1. MsgBox AscB("轻")             ' 123,  对吧 “轻”的Unicode编码是 8F 7B 两个字节,而 7B 转换成十进制就是 123
  2. 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 编码
  1. MsgBox AscW("轻")   ' -28805
  2. MsgBox Hex(AscW("轻"))   ' 8F7B  ' 不用再说了吧... 哈哈
复制代码

作者: Yisin    时间: 2011-5-1 18:48:35

说的真搞




欢迎光临 Scripts 学盟 (http://www.iscripts.org/) Powered by Discuz! X2