多年来,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输出的东西。

c语言ascw,VBS中的Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别相关推荐

  1. c语言ascw,Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别

    概要:多年来,BASIC程序员一直使用Asc和Chr函数来访问和操作ASCII字符集.随着Unicode被主流操作系统和应用程序所接受,需要改进版本的Asc和Chr函数已经开发了.为了满足这种需求,针 ...

  2. Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别

    概要:多年来,BASIC程序员一直使用Asc和Chr函数来访问和操作ASCII字符集.随着Unicode被主流操作系统和应用程序所接受,需要改进版本的Asc和Chr函数已经开发了.为了满足这种需求,针 ...

  3. C中堆管理—浅谈malloc,free,calloc,realloc函数之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> 在进行C/C++编程的时候,需要程序员对内存的了解比较好清楚,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由 ...

  4. Ansible(十七)-- ansible 中的循环(二) with_items with_list with_flattened with_together之间的区别和联系

    前文中,我们总结了with_items的用法,你肯定还有印象,前文中有如下两个示例,它们的执行效果是相同的 示例一 --- - hosts: testBremote_user: rootgather_ ...

  5. Android 中this、getContext()、getApplicationContext()、getApplication()、getBaseContext() 之间的区别...

    : 知之为知之,不知为不知是知也! 使用this, 说明当前类是context的子类,一般是activity application等; this:代表当前,在Activity当中就是代表当前的Act ...

  6. JDBC中Statement接口提供的execute、executeQuery和executeUpdate之间的区别

    Statement 接口提供了三种执行 SQL 语句的方法:executeQuery.executeUpdate 和 execute.使用哪一个方法由 SQL 语句所产生的内容决定. 方法execut ...

  7. Python 中 (,|)和(and,or)之间的区别 逻辑判断

    and or 符号 只是单一的对比 & | 适合批量对比 (&,|)和(and,or)是两组比较相似的运算符,用在"与"/ "或"上,在用法上有 ...

  8. Java中的wait()和sleep()方法之间的区别

    Java中的wait()和sleep()方法 (wait() and sleep() methods in Java) First, we will see how wait() method dif ...

  9. Python中列表的del,remove和pop函数之间的区别

    1)Python del函数 (1) Python del function) del is nothing but "delete". del is a keyword whic ...

最新文章

  1. MixNet了解一下,来自Google Brain最新SOTA移动AI架构
  2. Quartus II 15.0详细安装步骤
  3. Ant-Design-Vue和Icon按需加载方案 - JeecgBoot实战
  4. IE6下溢出多余文字
  5. OpenVINO安装步骤
  6. final关键字的用法
  7. BCB Victor 串口 VCL 控件,YbCommDevice1通过单片机接收多字节字符串
  8. hadoop组件中的hive安装
  9. 安川机器人SOCKET 通讯
  10. android微信表情导出来的,微信表情怎么导出 如何批量备份微信表情
  11. 【最全攻略】拼多多商家自研系统接入流程
  12. linux时间戳简介,linux 时间戳
  13. 标准结构篇:7)塑料齿轮轮系设计总章
  14. 计算机之父的童年故事教案,《“计算机之父”的童年故事》教学设计
  15. 为什么要处理自然语言? | NLP基础
  16. android的前景
  17. Neos.Flow UnitTestBootstrap
  18. macbook android 屏幕共享,苹果设备小技巧:iPhone,iPad,Mac进行屏幕共享和远程控制...
  19. Android内存优化总结
  20. th_TH是什么意思?

热门文章

  1. aka鉴权 ims_ims 注册鉴权认证过程
  2. mysql小王 保密_利用mysql的注射点得到更多mysql的信息
  3. 我有单片机,你有酒吗?
  4. STM32很难?这些工具可以帮大忙!
  5. 字符串_月隐学python第7课
  6. php 修改html文件内容吗,请问你们怎么将html的文件的内容改变为php
  7. php如何水平对齐所有星星,css怎么设置水平对齐
  8. mysql一对一修改_MYSQL的一对一
  9. inurllay old.php id,搜索技巧
  10. insert into 多条数据_「数据库」一千行MySQL命令