跳转到内容

数据表示基础:ASCII 和 Unicode

来自维基教科书,开放书籍,开放世界

试卷 2 - ⇑ 数据表示基础 ⇑

← 十进制数字的字符形式 ASCII 和 Unicode 错误检查 →


104 键 PC 美式英语 QWERTY 键盘布局演变自标准打字机键盘,并增加了用于计算的额外键。

ASCII 通常使用 8 位(1 字节)来存储每个字符。然而,第 8 位用作校验位,这意味着只有 7 位可用存储每个字符。这使得 ASCII 能够存储总共

2^7 = 128 different values.
95 个可打印的 ASCII 字符,编号从 32 到 126(十进制)

ASCII 值可以采取多种形式

  • 数字
  • 字母(大写和小写是分开的)
  • 标点符号(?/|\£$ 等)
  • 非打印命令(回车、转义、F1)

看看你的键盘,看看有多少个不同的键。一个 Windows 键盘应该是 104 个,传统键盘是 101 个。考虑到 shift 键值(a,A;b,B 等),并认识到一些键具有重复的功能(两个 shift 键,数字小键盘)。我们大约有 128 个键盘可以执行的功能。

二进制 十进制 十六进制 缩写
000 0000 0 00 NUL
000 0001 1 01 SOH
000 0010 2 02 STX
000 0011 3 03 ETX
000 0100 4 04 EOT
000 0101 5 05 ENQ
000 0110 6 06 ACK
000 0111 7 07 BEL
000 1000 8 08 BS
000 1001 9 09 HT
000 1010 10 0A LF
000 1011 11 0B VT
000 1100 12 0C FF
000 1101 13 0D CR
000 1110 14 0E SO
000 1111 15 0F SI
001 0000 16 10 DLE
001 0001 17 11 DC1
001 0010 18 12 DC2
001 0011 19 13 DC3
001 0100 20 14 DC4
001 0101 21 15 NAK
001 0110 22 16 SYN
001 0111 23 17 ETB
001 1000 24 18 CAN
001 1001 25 19 EM
001 1010 26 1A SUB
001 1011 27 1B ESC
001 1100 28 1C FS
001 1101 29 1D GS
001 1110 30 1E RS
001 1111 31 1F US
111 1111 127 7F DEL
二进制 十进制 十六进制 字形
010 0000 32 20 ?
010 0001 33 21 !
010 0010 34 22 "
010 0011 35 23 #
010 0100 36 24 $
010 0101 37 25 %
010 0110 38 26 &
010 0111 39 27 '
010 1000 40 28 (
010 1001 41 29 )
010 1010 42 2A *
010 1011 43 2B +
010 1100 44 2C ,
010 1101 45 2D -
010 1110 46 2E .
010 1111 47 2F /
011 0000 48 30 0
011 0001 49 31 1
011 0010 50 32 2
011 0011 51 33 3
011 0100 52 34 4
011 0101 53 35 5
011 0110 54 36 6
011 0111 55 37 7
011 1000 56 38 8
011 1001 57 39 9
011 1010 58 3A :
011 1011 59 3B ;
011 1100 60 3C <
011 1101 61 3D =
011 1110 62 3E >
011 1111 63 3F ?
二进制 十进制 十六进制 字形
100 0000 64 40 @
100 0001 65 41 A
100 0010 66 42 B
100 0011 67 43 C
100 0100 68 44 D
100 0101 69 45 E
100 0110 70 46 F
100 0111 71 47 G
100 1000 72 48 H
100 1001 73 49 I
100 1010 74 4A J
100 1011 75 4B K
100 1100 76 4C L
100 1101 77 4D M
100 1110 78 4E N
100 1111 79 4F O
101 0000 80 50 P
101 0001 81 51 Q
101 0010 82 52 R
101 0011 83 53 S
101 0100 84 54 T
101 0101 85 55 U
101 0110 86 56 V
101 0111 87 57 W
101 1000 88 58 X
101 1001 89 59 Y
101 1010 90 5A Z
101 1011 91 5B [
101 1100 92 5C \
101 1101 93 5D ]
101 1110 94 5E ^
101 1111 95 5F _
二进制 十进制 十六进制 字形
110 0000 96 60 `
110 0001 97 61 a
110 0010 98 62 b
110 0011 99 63 c
110 0100 100 64 d
110 0101 101 65 e
110 0110 102 66 f
110 0111 103 67 g
110 1000 104 68 h
110 1001 105 69 i
110 1010 106 6A j
110 1011 107 6B k
110 1100 108 6C l
110 1101 109 6D m
110 1110 110 6E n
110 1111 111 6F o
111 0000 112 70 p
111 0001 113 71 q
111 0010 114 72 r
111 0011 115 73 s
111 0100 116 74 t
111 0101 117 75 u
111 0110 118 76 v
111 0111 119 77 w
111 1000 120 78 x
111 1001 121 79 y
111 1010 122 7A z
111 1011 123 7B {
111 1100 124 7C |
111 1101 125 7D }
111 1110 126 7E ~

如果你仔细观察每个字符的 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 码的含义,我们可以使用以下函数 ChrW(x),它返回十进制值为 x 的 ASCII 码。尝试以下代码查看前 128 个字符。字符 10 有什么特别之处?

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
华夏公益教科书