VBS中的Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别
- 2020-10-27 08:00:00
- Demon 转贴
- 4613
多年来,BASIC程序员一直使用Asc和Chr函数来访问和操作ASCII字符集。随着Unicode被主流操作系统和应用程序所接受,需要改进版本的Asc和Chr函数已经开发了。为了满足这种需求,针对Windows系统的Microsoft Visual Basic(4.0以及更高版本)包括了AscB、ChrB和AscW、ChrW函数。
Unicode是一种为代替ANSI标准而设计的,把字符编码成数值形式的标准。因为ANSI标准只使用单个字节来代表每个字符,它受最大256个字符的限制。虽然这对于英语受众来说已经足够,但当考虑到全球软件市场时,它无法满足。使用Unicode标准,每个字符由两个字节表示,因此整个的Unicode字符集包括了65536个可能的位置。
微软的Windows NT, Windows 2000, and Microsoft OLE 2.0完全基于Unicode设计,而且Visual Basic(4.0以及更高版本)在内部使用Unicode格式来表示所有的字符串。AscW和ChrW函数允许对Unicode字符的全范围访问。这些函数和原始的Asc、Chr函数运行方式相同,唯一的区别在于新函数支持0到65536的参数,而原来的只能是0到255。许多Visual Basic对象(例如调试窗口、标签、文本框),当它们不知道怎样显示一个Unicode字符时,会返回一个“?”。
因为所有的字符串现在在内部由Unicode格式表示,它不像以前表示一个字符串里的二进制数据那样简单。使用Chr函数来分配数据给一个字符串的结果不再向以前一样。例如:
stringvar = Chr(65)
结果是一个两字节长的字符串,其中第一字节的值为65,第二字节的值为0(这是Unicode表示的字母“A”)。需要记住的是,从ANSI转换至Unicode并不总是意味着像这个例子里做的那样,仅仅添加一个值为0的第二字节。例如,大多数在130~159范围内的ANSI字符码拥有完全不同的Unicode值。尝试运行’Debug.Print AscW(Chr(130))’,然后一个8218的值会显示出来。
当前,windows系统需要一个“小端序(Little-Endian)”的处理器,意味着对于多字节数据中,最低有效位是存储在第一字节处,其他的依次出现在后面字节。这解释了为什么Unicode字符"A"在内部如下表示:
------------------- | 65 | 0 | ------------------- byte 0 byte 1
AscB和ChrB函数可用于代替那些原来由Asc和Chr函数完成的功能,因为这些函数允许操作单个字节量。如果你想要一个4字节的连续地有二进制值65、66、67、68的字符串,那么使用Chr函数不起作用。你必须使用ChrB函数代替。例如:
stringvar = ChrB(65) & ChrB(66) & ChrB(67) & ChrB(68)
或者,你可以使用创建新字节数据型的数组并且用这种方法操纵你的二进制数据。
下面列出的是对一些简单使用这些函数的结果的解释以便深入阐明这个信息。
Print Asc(Chr(255)) –> "255"
这里没有什么新奇的,除了Chr函数返回一个占据两字节的Unicode字符而不是一个一字节的ANSI字符外。
Print Asc(ChrB(255)) –> 5 –无效的过程调用
这个使用返回了一个错误因为Asc函数总是期待至少2个字节的参数但是ChrB函数仅仅返回一个字节。
Print Asc(Chr256)) –> 5 –无效的过程调用
尽管Chr函数返回一个两字节的Unicode字符,它还是只能使用0到255的数字作为它的参数(注意,在一个支持DBCS的系统中,Asc/Chr处理两字节DBCS字符,转换它们为Unicode)。使用ChrW函数允许对全部65536个字符地址的访问。
Print AscW(ChrW(256)) –> "256"
这是本部分第一段所说的新版本。ChrW函数接受从0到65536的参数,且返回那个字符(在32位系统中)。AscW函数解释这个两字节的字符为一个Unicode字符并返回正确的Unicode值。
Print Asc(ChrW(256)) –> "65" Print Asc(ChrW(5000)) –> "63"
这里发生的是,ChrW函数首先计算。ChrW(256)是字符"A",所以这个函数简化为Asc("A"),而Unicode(和ANSI)对应"A"的数字是65。因为VB不知道怎样显示用Chr(5000)表示的字符,它就显示了一个"?",而正如所期待的,Unicode和ANSI对应"?"的值为63。
Print AscB(Chr(65)) –> "65" Print AscB(ChrW(256)) –> "0" Print AscB(ChrW(257)) –> "1" Print AscB(ChrW(555)) –> "43" Print AscB(ChrW(65535)) –> "255"
所有这些返回的值能够通过理解每个字符在内部如何表示来解释(看上面提到的小端序),并且由于那个事实,即AscB函数只看它接收的字符的第一个字节。直观来说,它看起来像如下图表:
------------------- Chr(65) | 65 | 0 | ------------------- Chr(256) | 0 | 1 | ------------------- Chr(257) | 1 | 1 | ------------------- Chr(555) | 43 | 1 | ------------------- Chr(65535)| 255 | 255 | ------------------- byte 0 byte 1
AscB函数仅返回任何字符的第一个字节。
Print ChrB(65) –> ""
Visual Basic对这个对ChrB函数的调用什么都不显示,因为ChrB函数仅返回一个一字节的字符串。像这样的一个字节的字符串对Visual Basic毫无意义,因为它们不构成一个有效的Unicode字符(或者一系列字符)。
Print ChrB(65) & ChrB(0) –> "A"
在这个例子中,我们把两个一字节的字符串连接成为一个单独的两字节的字符串。由于生成的位模式和Unicode的"A"一样的,那就是Visual Basic输出的东西。
- office课程播放地址及课程明细
- Excel Word PPT Access VBA等Office技巧学习平台
- 将( .accdb) 文件格式数据库转换为早期版本(.mdb)的文件格式
- 将早期的数据库文件格式(.mdb)转换为 (.accdb) 文件格式
- KB5002984:配置 Jet Red Database Engine 数据库引擎和访问连接引擎以阻止对远程数据库的访问(remote table)
- Access 365 /Access 2019 数据库中哪些函数功能和属性被沙箱模式阻止(如未启动宏时)
- Access Runtime(运行时)最全的下载(2007 2010 2013 2016 2019 Access 365)
- Activex控件或Dll 在某些电脑无法正常注册的解决办法(regsvr32注册时卡住)
- office使用部分控件时提示“您没有使用该ActiveX控件许可的问题”的解决方法
- RTF文件(富文本格式)的一些解析
- Access树控件(treeview) 64位Office下出现横向滚动条不会自动定位的解决办法
- Access中国树控件 在win10电脑 节点行间距太小的解决办法
- EXCEL 2019 64位版(Office 2019 64位)早就支持64位Treeview 树控件 ListView列表等64位MSCOMMCTL.OCX控件下载
- VBA或VB6调用WebService(直接Post方式)并解析返回的XML
- 早期PB程序连接Sqlserver出现错误
- MMC 不能打开文件C:/Program Files/Microsoft SQL Server/80/Tools/Binn/SQL Server Enterprise Manager.MSC 可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版
- sql server连接不了的解决办法
- localhost与127.0.0.1区别
- Roych的浅谈数据库开发系列(Sql Server)
- sqlserver 自动备份对备份目录没有存取权限的解决办法
- 安装Sql server 2005 express 和SQLServer2005 Express版企业管理器 SQLServer2005_SSMSEE
联系人: | 王先生 |
---|---|
Email: | 18449932@qq.com |
QQ: | 18449932 |
微博: | officecn01 |