6. ASCII 编码

本节课我们来讲解关于英文编码的知识。

在计算机系统中,我们在屏幕上看到的每一个字就是一张图片。这些图片存储在字体库中。

各个系统字体库的位置:

MacOS 系统的字体库如下图所示:

MacOS 系统的字体库位置

为了准确定位些图片的位置,计算机系统为每一张图片都定义了一个唯一的编号,我们把这个编号叫做编码(Code)

字体的编码是一个无符号类型的整数,这个数值是从零开始的。

对于英文的编码,计算机中通常使用 美国信息交换标准代码 进行编码和通信。ASCII 全称是American Standard Code for Information Interchange,中文翻译为:美国信息交换标准代码。

在 MacOS 或 Linux 的终端中,输入 man ascii 命令就可以查看到这个 128 个字符的编码值和对应的字符。如在Linux 下是使用如下命令:

man ascii

显示结果如下:

Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
────────────────────────────────────────────────────────────────────────
000   0     00    NUL '\0' (null character)   100   64    40    @
001   1     01    SOH (start of heading)      101   65    41    A
002   2     02    STX (start of text)         102   66    42    B
003   3     03    ETX (end of text)           103   67    43    C
004   4     04    EOT (end of transmission)   104   68    44    D
005   5     05    ENQ (enquiry)               105   69    45    E
006   6     06    ACK (acknowledge)           106   70    46    F
007   7     07    BEL '\a' (bell)             107   71    47    G
010   8     08    BS  '\b' (backspace)        110   72    48    H
011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
012   10    0A    LF  '\n' (new line)         112   74    4A    J
013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
014   12    0C    FF  '\f' (form feed)        114   76    4C    L
015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
016   14    0E    SO  (shift out)             116   78    4E    N
017   15    0F    SI  (shift in)              117   79    4F    O
020   16    10    DLE (data link escape)      120   80    50    P
021   17    11    DC1 (device control 1)      121   81    51    Q
022   18    12    DC2 (device control 2)      122   82    52    R
023   19    13    DC3 (device control 3)      123   83    53    S
024   20    14    DC4 (device control 4)      124   84    54    T
025   21    15    NAK (negative ack.)         125   85    55    U
026   22    16    SYN (synchronous idle)      126   86    56    V
027   23    17    ETB (end of trans. blk)     127   87    57    W
030   24    18    CAN (cancel)                130   88    58    X
031   25    19    EM  (end of medium)         131   89    59    Y
032   26    1A    SUB (substitute)            132   90    5A    Z
033   27    1B    ESC (escape)                133   91    5B    [
034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
035   29    1D    GS  (group separator)       135   93    5D    ]
036   30    1E    RS  (record separator)      136   94    5E    ^
037   31    1F    US  (unit separator)        137   95    5F    _
040   32    20    SPACE                       140   96    60    `
041   33    21    !                           141   97    61    a
042   34    22    "                           142   98    62    b
043   35    23    #                           143   99    63    c
044   36    24    $                           144   100   64    d
045   37    25    %                           145   101   65    e
046   38    26    &                           146   102   66    f
047   39    27    '                           147   103   67    g
050   40    28    (                           150   104   68    h
051   41    29    )                           151   105   69    i
052   42    2A    *                           152   106   6A    j
053   43    2B    +                           153   107   6B    k
054   44    2C    ,                           154   108   6C    l
055   45    2D    -                           155   109   6D    m
056   46    2E    .                           156   110   6E    n
057   47    2F    /                           157   111   6F    o
060   48    30    0                           160   112   70    p
061   49    31    1                           161   113   71    q
062   50    32    2                           162   114   72    r
063   51    33    3                           163   115   73    s
064   52    34    4                           164   116   74    t
065   53    35    5                           165   117   75    u
066   54    36    6                           166   118   76    v
067   55    37    7                           167   119   77    w
070   56    38    8                           170   120   78    x
071   57    39    9                           171   121   79    y
072   58    3A    :                           172   122   7A    z
073   59    3B    ;                           173   123   7B    {
074   60    3C    <                           174   124   7C    |
075   61    3D    =                           175   125   7D    }
076   62    3E    >                           176   126   7E    ~
077   63    3F    ?                           177   127   7F    DEL

这里对每一个英文字符进行了编码:如 z 的编码值是172(八进制)、122(十进制)、7A(十六进制)。

取值范围:

英文的字母编码值在 0~127 之间,使用 7 个位就可以保存一个字符,在 C 语言中通常使用 char 类型来保存一个字符。最高位为 0

这个编码表不需要死记硬背。我一般只记住了 0Aa 的值十进制表示分别是 486597,十六进制是304161,其它都可以通过计算得到。

练习:

  1. 字符 B 的 ASCII 编码值是多少(十进制和十六进制的值)?
  2. 字符 e 的 ASCII 编码值是多少(十进制和十六进制的值)?
  3. 字符 8 的 ASCII 编码值是多少(十进制和十六进制的值)?
  4. 换行符 \n 的 ASCII 编码值是多少?