天天看點

「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元

作者:oeasy

ASCII 碼表

回憶上次内容

  • ord(c)和chr(i)
    • 這是倆函數
    • 這倆函數是一對,相反相成的⚖️
      • ord 通過 字元 找到對應的 數字
      • chr 通過 數字 找到對應的 字元
    • 字元 的本質是 數字
  • 字元都對應着一些數字
    • a 對應 97
    • b 對應 98
    • c 對應 99
  • 都連号好像應該是天經地義的?
    • 為什麼小寫a從97開始?
    • 但除了小寫字母之外還有很多字元
    • 他們都是如何分布的呢?

小寫字母

#輸出a,b,c
ord("a")
ord("b")
ord("c")
#輸出a的相對序号
ord("a")-ord("a")
#輸出z-a的數字差距,相對序号
ord("z")-ord("a")           
  • a、b、c 這些字元是挨着的
  • 正好從0到25,總共26個
  • 對應數字也是挨着的
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元

編碼規律

  • 從 a-z 應該都是挨着的
    • 26 個英文字母
  • 為什麼是從 97 開始?
    • 應該還有别的字元
  • 低頭看一下鍵盤
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 除了小寫字母之外
    • 大寫字母
    • 數字
    • 符号
  • 大概有多少個字元呢?

字元全排列

  • 每一個字元都會對應一個序号
    • 序号用二進制的方式存在位元組(byte)中
    • 一個位元組(byte)總有8位(bit)
    • 每一位(bit)是一個二進制(binary)數字(digit)
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 從 8個0 到 8個1 相當于
    • 從 0 到 255
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 我想要
    • 把所有可能的序号對應的字元都數一遍
    • 可行麼?

周遊範圍

for i in range(2 ** 8):
    print(i,end=",")           
  • 周遊範圍是[0, 28)
    • 也就是[0, 256)
    • 前閉後開
    • 不包含256
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 我們先把 從0到255 挨排兒捋一遍
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 如何通過序号找到對應的字元呢?

對應的字元

  • 通過數字找到對應的字元是chr
for n in range(255):
    print(chr(n),end="")
    if n % 16 == 0:
        print()           
  • print(chr(n),end="")
    • chr(n)
      • 輸出n的字元狀态
    • end=""
      • 結束時什麼也不輸出
      • 不輸出預設的換行
  • if n % 16 == 0:
    • print()
    • 如果n能被16整除
    • 那麼輸出換行
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 結果如何呢?

結果

「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 字母和數字還是挺完整的
  • 這套對應關系有沒有個名字呢?

ASCII 碼表

  • 當時美國的工程師定義了一套編碼規則
    • ASCII
      • American Standard Code for Information Interchange
    • 美國資訊交換标準代碼
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 這建立起了 字元 和 二進制01 的 映射關系
    • 字元 和 二進制數 的 映射關系 如果不一緻
      • 面對同一個二進制數 01010101
      • 就會映射到不同的字元
      • 人們看到不同的字元就認為是亂碼
  • 這套ascii标準在各種計算機系統中需要統一
  • 否則無法通信
  • 這個 ASCII 什麼時候開始有的呢?

初現

  • 1967 年的時候就有了最初這個 ASCII 碼表
    • 當時計算機
      • 低電平表示 0
      • 高電平表示 1
      • 電子計算機中所有的資料都是 0 和 1
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 先是由美國國家标準學會制定
    • (American National Standard Institute , ANSI )
    • 最初是美國的國家标準
    • 被稱作美國資訊交換标準代碼
  • 美國之外的國家如何編碼基本字元呢?

國際化

  • 後來是國際标準化組織定為國際标準ISO
    • International Organization for Standardization a.k.a. ISO
    • 稱為 ISO 646 标準
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 最後一次更新則是在 1986 年
    • 到目前為止共定義了 128 個字元
  • 能否完整系統地看到整個ascii碼表的對應關系呢?

ascii

  • 我們先來下個ascii程式
sudo apt install ascii           
  • 上面的指令可以安裝ascii這個應用
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元

使用ascii

  • 每一字元有三個部分組成
    • Dec 對應的是 10 進制數
    • Hex 對應的是 16 進制數
    • 最後一列 對應的是 具體字元或功能
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 字元包括
    • 控制
    • 符号
    • 英文大寫字母
    • 英文小寫字母
  • 這樣就把各種字元和一個二進制數字對應起來了

解碼 ASCII

  • 我們找到小寫的a
    • 這個小寫的 a 在電腦中存儲的時候
    • 對應着一個位元組
      • 8位2進制數
      • 也就是8位(0或者1)
  • 到底是多少呢?
  • 先沿着下圖中1的方向
    • 向上找到110
    • 這是他的高三位
    • 765位
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 再沿着2的方向
    • 向左找到0001
    • 這是他的低四位
    • 4321位
    • 在前面加一個0
    • 得到(01100001)2進制

總結

  • 這次我們了解了ASCII碼表
    • ASCII 碼表就是
      • American Standard Code for Information Interchange
    • 美國資訊交換标準代碼
  • ASCII 碼表範圍
    • 0x30-0x39 這個範圍是 數字
      • 數字的編碼減去 0x30 正好得到數字本身
    • 0x41-0x5A 這個範圍是 大 寫字母
    • 0x61-0x7A 這個範圍是 小 寫字母
    • 0x20-0x7F 之間各處零散排布着各種符号
「oeasy」python0013_ASCII碼表_英文字元編碼_鍵盤字元
  • 字元在計算機當中是用二進制方式存儲的
  • 我們現在可以得到字元的序号
  • 但是能通過字元序号
  • 得到字元的二進制形态麼?
  • 我們下次再說
  • 藍橋->https://www.lanqiao.cn/teacher/3584
  • github->https://github.com/overmind1980/oeasy-python-tutorial
  • gitee->https://gitee.com/overmind1980/oeasypython
  • 視訊->https://www.bilibili.com/video/BV1CU4y1Z7gQ 作者:oeasy