数据表示基础:ASCII 和 Unicode
ASCII 通常使用 8 位(1 字节)来存储每个字符。然而,第 8 位用作校验位,这意味着只有 7 位可用存储每个字符。这使得 ASCII 能够存储总共
2^7 = 128 different values.
还有 扩展 ASCII 使用第 8 位来存储数据,允许更大的字符集,但对于考试来说,你可能只需要了解 7 位奇偶校验 ASCII |
ASCII 值可以采取多种形式
- 数字
- 字母(大写和小写是分开的)
- 标点符号(?/|\£$ 等)
- 非打印命令(回车、转义、F1)
看看你的键盘,看看有多少个不同的键。一个 Windows 键盘应该是 104 个,传统键盘是 101 个。考虑到 shift 键值(a,A;b,B 等),并认识到一些键具有重复的功能(两个 shift 键,数字小键盘)。我们大约有 128 个键盘可以执行的功能。
|
|
|
|
如果你仔细观察每个字符的 ASCII 表示,你可能会注意到一些规律。例如
二进制 | 十进制 | 十六进制 | 字形 |
---|---|---|---|
110 0001 | 97 | 61 | a |
110 0010 | 98 | 62 | b |
110 0011 | 99 | 63 | c |
如你所见,a = 97,b = 98,c = 99。这意味着如果我们知道一个字符的值,我们可以很容易地计算出后续或先前字符的值。
示例:ASCII 字符 不用看上面的 ASCII 表!如果我们知道字符 '5' 的 ASCII 值是 011 0101,那么 '8' 的 ASCII 值是多少? 我们知道 '8' 是 '5' 之后的三个字符,因为 5,6,7,8。这意味着 '8' 的 ASCII 值将比 '5' 大三个。 011 0101 ASCII '5' + 011 -------- 011 1000 ASCII '8' 上面的检查表明这是正确的值。 如果你担心在二进制加法中犯错,你可以用十进制数来处理。以 'g' 的 ASCII 值为 110 0111,那么 'e' 是多少? 我们知道 'e' 是 'g' 之前的两个字符,因为 e, f, g。这意味着 'e' 的 ASCII 值将比 'g' 小两个。 64 32 16 8 4 2 1 1 1 0 0 1 1 1 = 10310 = ASCII value of 'g' 103 - 2 = 10110 64 32 16 8 4 2 1 1 1 0 0 1 0 1 = 10110 = ASCII value of 'e' |
练习:ASCII 不用使用参考表(考试时你不会得到它!)回答以下问题 字母 'Z' 的 ASCII 码为 90(十进制),字母 'X' 如何存储? 答案 88 - 因为它是字母表中向下的第 2 个字符。
以下文本使用了多少个 ASCII '字符'? Hello Pete, ASCII rocks! 答案 27 或 26。如果你说是 23,那你错了,因为你必须包括每行末尾的非打印字符。每行末尾需要一个 EOL 命令,新行需要一个回车符(CR),使文本如下所示: Hello Pete,[EOL][CR] ASCII rocks![EOL] |
对于拉丁字母,ASCII 通常是可以的,但是如果你想写一些中文或印地语呢?我们需要另一种编码方案!
扩展:编码 ASCII 当你从文本文件中读取数据时,你可能需要使用 ASCII 码。要查看每个 ASCII 码的含义,我们可以使用以下函数 For x = 0 To 127
Console.WriteLine("ASCII for " & x & " = " & ChrW(x))
Next
Console.ReadLine()
|
ASCII 的问题在于它只允许你表示少量的字符(对于 扩展 ASCII 来说大约是 128 或 256 个)。如果你住在英语国家,这可能没问题,但如果你住在使用不同字符集的国家会怎样?例如
你可以看到,我们很快就会遇到麻烦,因为 ASCII 不可能在只有 7 位的情况下存储这些数十万个额外的字符。我们使用的替代方法是 Unicode。Unicode 有多个版本,每个版本使用不同的位数来存储数据
名称 | 描述 |
---|---|
UTF-8 | 8 位是 Unicode 最常用的格式。字符可以使用低至 8 位,最大限度地与 ASCII 兼容。但也允许可变宽度编码扩展到 16、24、32、40 或 48 位,以处理更大的字符集 |
UTF-16 | 16 位,可变宽度编码,可以扩展到 32 位。 |
UTF-32 | 32 位,固定宽度编码。每个字符都占用 32 位。 |
有超过一百万个可能的字符,我们应该能够存储来自地球上所有语言的每个字符,看看这些示例
码位 | 字形* | 字符 | UTF-16 码元 (十六进制) |
---|---|---|---|
U+007A | z | 拉丁语 小写字母 Z | 007A |
U+6C34 | 水 | CJK 统一表意文字-6C34(水) | 6C34 |
U+10000 | 线形文字 B 音节 B008 A | D800, DC00 | |
U+1D11E | 音乐符号 G 谱号 | D834, DD1E |
你可以在 维基百科 上找到更多关于 Unicode 编码的信息
练习:ASCII 和 Unicode 不用使用参考表(考试时你不会得到它!)回答以下问题 字母 'D' 的 ASCII 码为 100 0100,字母 'G' 如何存储? 答案 100 0111 - 因为它是字母表中向后的第 3 个字符。
字母 's' 的 ASCII 码为 111 0011,字母 'm' 如何存储? 答案 110 1101 - 因为它是字母表中向下的第 6 个字符。 使用 ASCII 的一个优点是什么? 答案 Each character only takes up 8 bits, meaning that storing data in ASCII may take up less memory than unicode 使用 Unicode 比 ASCII 的一个优点是什么? 答案 ASCII stores a much smaller character set than unicode, meaning that you are limited to the Latin character set and cannot represent characters from other languages. 7 位 ASCII 可以表示多少个不同的字符? 答案 2^7 = 128 你正在为全球使用设计一个计算机系统,你应该使用哪种字符编码方案,为什么? 答案 unicode as it would allow you to display non Latin character sets such as Hindi and Cyrillic |