设为首页收藏本站

Scripts 学盟

 找回密码
 加入学盟

QQ登录

只需一步,快速开始

查看: 3745|回复: 1
打印 上一主题 下一主题

VBScript 中的 Asc, AscB, AscW [复制链接]

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
Alvin 实名认证  发表于 2011-4-26 22:26:16 |只看该作者 |倒序浏览
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  ' 不用再说了吧... 哈哈
复制代码
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0

Rank: 6Rank: 6

2#
Yisin 发表于 2011-5-1 18:48:35 |只看该作者
说的真搞
路不好走,你却依旧满眼的爱,找不到理由...

使用道具 举报

您需要登录后才可以回帖 登录 | 加入学盟

手机版|Scripts 学盟   |

GMT+8, 2024-4-24 06:13 , Processed in 1.095063 second(s), 13 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部