概要:多年来,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,Asc/AscB/AscW和Chr/ChrB/ChrW函数之间的区别相关推荐

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

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

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

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

  3. oracle asc 汉字,oracle中chr()和ascii()函数(附常用字符与ascii对照表)

    今天修改数据库时,有较长字符串无法直接复制到某一个字段,开始以为是字符串太大了,但是长度距离VARCHAR2的上限还有很多,只有1700多个字符.检查这个字符按串和对应的错误.发现很怪异,是ORA-0 ...

  4. lisp语言cond和if套用_方案 – if和cond之间的区别?

    but when running, cause error: procedure application: expected > procedure, given: #; arguments w ...

  5. Scala语言学习-06-传名参数、传值参数、传函数参数的区别

    一.测试环境 名称 版本 操作系统 win10 CPU 12th Gen Intel® Core™ i7-12700H 内存 16G JDK 1.8.0_171 Scala 3.1.2 二.代码 ob ...

  6. c语言goord函数,php的chr和ord函数实现字符加减乘除运算实现代码

    php的chr和ord函数实现字符加减乘除运算实现代码 chr函数用于将ASCII码转换为字符 ord函数是用来字符转换为ASCII码 ASCII码是计算机所能显示字符的编码,它的取值范围是0-255 ...

  7. 【学习日志】2022.09.02 (C++)strcmp和stricmp、strcmpi三者之间的区别、C语言判断文件后缀名、ZENO Audio Update、TEN MINUTES PHYSICS

    (C++)strcmp和stricmp.strcmpi三者之间的区别 (strcmpi在Windows C标准库实现,但不在GNU C标准库实现) #include <string.h> ...

  8. R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息

    R语言ggplot2可视化散点图.可视化两个数值变量之间的关系(Scatter plot).使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线.自定义数据点的大小.色彩.添加 ...

  9. R语言ggplot2可视化可视化聚类图、使用geom_encircle函数绘制多边形标定属于同一聚类簇的数据点、并自定义每个聚类簇数据点的颜色、多边形框的颜色(Cluster Plot)、主副标题题注

    R语言ggplot2可视化可视化聚类图.使用geom_encircle函数绘制多边形标定属于同一聚类簇的数据点.并自定义每个聚类簇数据点的颜色.多边形框的颜色(Cluster Plot).主副标题题注 ...

最新文章

  1. pycharm 如何导入、导出设置?
  2. 【项目管理】Scrum内容整理
  3. go 并发安全map 分段锁实现
  4. 编写字符串反转函数 .
  5. Java 8 CompletableFuture 教程 1
  6. 代码编写工具_我希望在开始编写代码时就已经知道的工具:已复习
  7. python数字类型怎么学,python的数字类型学习之数据类型
  8. mysql A库a表 B库b表 将a表导入b表中
  9. linux 邮件附件 中文,linux bash下通过mailx发送中文内容显示为附件的解决
  10. python 解析命令行
  11. Vue2.0 $set()处理数据更新但视图不更新的问题(给对象添加属性必须用this.$set(this.data,”key”,value’))
  12. 基于隐马尔可夫模型的有监督词性标注
  13. KYLO的数据库知识总结
  14. 微信新规定!好友之间转账超五千元或将收取手续费,望周知
  15. 关于边缘计算和边云协同,看这一篇就够了~
  16. 阅读书籍:Monte Carlo Methods(第一章 Introduction to Monte CarloMethods)
  17. Multimodal Gesture Recognition Using 3-D Convolution and Convolutional LSTM
  18. 百度地图--证书认证问题
  19. 【JoJo的摄影笔记】相机分类新约
  20. 801冠号大全及桃花荧光

热门文章

  1. mysql-interview
  2. Spring Boot 为什么这么火?
  3. ASP.NET Core 入门教程 6、ASP.NET Core MVC 视图布局入门
  4. Android 使用摄像头拍照
  5. 好事也要好做---孔子责子贡
  6. 第 127 章 Piranha - Cluster administation tools
  7. LInux main.cpp 编码问题 导致影响后面的内容
  8. 医疗安全监控与检测平台WattsUpDoc
  9. python中try except处理程序异常的三种常用方法
  10. (未完)httpd进程数查询,prefork模式修改apache最大连接数