《汇编程序设计与计算机体系结构:软件工程师教程》 —1.4.5 怎样保存字符

华章计算机 发表于 2019/12/04 10:55:47 2019/12/04
【摘要】 本节书摘来自华章计算机《汇编程序设计与计算机体系结构:软件工程师教程》一书中第1章,第1.4.5节,作者是布莱恩·R. 霍尔(Brian R. Hall)[美] 凯文·J.斯隆卡(Kevin J. Slonka),爱飞翔 译。

1.4.5 怎样保存字符

“A”或“$”这样的字符是逻辑符号,它在底层需要以数字的形式来表示,至于每一个字符究竟应该与哪个整数相对应,则由字符集确定,字符集也叫作字符映射或码表。现在简单介绍几种常见的字符集以及它们之间的关系。

有一种很旧而又很常见的字符集,叫作 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)。这是一种 7 位字符集,意味着它可以表示 128 种(也就是 27 种)不同的字符,其中大部分是英文字母。C++ 等高级语言使用 ASCII 作为默认的字符集。许多网站都能找到完整的 ASCII 字符表,例如https://en.wikipedia.org/wiki/ASCII。各范围内的ASCII字符如表1-6所示。

表1-6 各范围内的 ASCII 字符

image.png

 

像 ASCII 这样的码表,可以把字符很方便地与整数对应起来。比方说,范例 1-16 就列出了“A”与“$”这两个字符,并根据 ASCII 码表将其转换成对应的二进制整数。

范例 1-16 ASCII 字符与整数之间的转换

 image.png

ASCII 可以用很多方式来扩展,以表示其他拉丁系的字母及符号。其中最常见的一种标准扩展方式是 ISO(International Organization for Standardization,国际标准化组织)与 IEC(International Electrotechnical Commission,国际电工委员会)制定的 ISO/IEC 8859。它把 7 位的 ASCII 扩展成 8 位,从而可以表示 256 种(也就是 28 种)字符。其他一些扩展方式也是把 ASCII 扩充为 8 位,例如 IBM Code page 437、Windows-1252 及 macOS Roman,这些字符集在 0 至 127 这一范围内与标准的 ASCII 相同,但在 128 至 255 这一范围内则采用不同的办法来编码。

到 2008 年左右,ISO/IEC 10646 与 Unicode 这样的映射方案成了最为流行的字符集。这些复杂的方案支持更多字符,同时还与标准的 ASCII 相兼容。Unicode 字符集能够以任何一种办法来编码,其中最常用的一种叫作 UTF-8(UTF是Unicode Transformation Format,Unicode 转换格式)。互联网上的很多网页用的都是这种字符编码(character encoding)方式,它支持 1 112 064 个字符,其中每个字符可能要用 1 至 4 个 octet 来表示(octet 指的是由 8 个二进制位所构成的组,相当于一个字节)。此外,还有其他一些 Unicode 字符编码方式,例如 UTF-16用一个或两个 16 位的字(word)来表示字符,UTF-32用一个 32 位的值来表示字符。

      编程知识:Unicode 这样的字符集给其中的每个字符(或者说符号)都指定了一个独特的数字,这个数字有时称为代码点或码位(code point,例如 A 的代码点是 U+0041)。至于代码点究竟应该怎样化为二进制序列,则要由算法来决定,这个算法称为字符编码方式,比方说,如果采用 UTF-8 字符编码方式,那么 U+0041 代码点就会化为 01000001。

 

Unicode 字符集可以把每一个逻辑符号都映射到互不相同的代码点上,代码点的写法是字母 U 后面添一个加号,再跟十六进制值,如范例1-17所示。具体的 UTF 编码方式会把Unicode 字符转换成一个二进制序列,这个序列可以表示成任意进制。不过要注意,同一个符号在不同的 UTF 编码方式下可能会转换成不同的序列,比方说,范例 1-17 中的版权符号按照 UTF-8 格式来编码所得的结果,就与 UTF-16 及 UTF-32 格式不同。由此可见,同一套字符集(例如 Unicode)里的字符在不同的字符编码方式(例如 UTF-8、UTF-16、UTF-32)下可能会转化为不同的二进制序列。

范例 1-17 Unicode 字符集中的符号按照各种 UTF 格式来编码所得到的二进制序列

 image.png

标准的 7 位 ASCII 码可以视为 ISO-8859 及各种 UTF 编码的子集。比方说,如果把编码中最右侧的二进制位叫作第 0 位,那么只需要给 ASCII 码的左方添一个 0,就可以构成有效的 UTF-8 编码了(此时,编码的第 7 位是 0)。UTF-8 编码的前 128 个字符与 ASCII 码是一一对应的。

字符串通常用字符序列来表示,其中的字符可以是 ASCII 码或 Unicode 码。比方说,如果用 ASCII 码来表示 “ABC123” 这个字符串,并以十六进制来书写编码后的字符序列,那么就是41h, 42h, 43h, 31h, 32h, 33h, 0h。最后的 0h 称为 NULL 字符,表示字符串到此结束。要注意:在编写及调试程序的时候,字符与字符序列一般会用对应的十六进制码来表示。本书第 3 章及第 7 章会详细讲解字符串。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。