天天看點

「oeasy」python0018_ ASCII_字元分布_數字

作者:oeasy

打包和解包

回憶上次内容

  • decode
    • 就是解碼
  • 解碼和編碼可以轉化
    • encode 編碼
    • decode 解碼
    • 互為逆過程
  • 大小寫字母之間序号全都相差(32)10進制
「oeasy」python0018_ ASCII_字元分布_數字
  • 這是為什麼呢?

差距

  • 大寫字母和小寫字母
    • 總是相差(32)10進制
「oeasy」python0018_ ASCII_字元分布_數字
  • 從10進制角度看不清楚
  • 我們從16進制的角度看看

16進制

  • 正好是(0x20)16進制
「oeasy」python0018_ ASCII_字元分布_數字
  • 為什麼不多不少
    • 就差 0x20 呢?
    • 怎麼那麼寸呢?
  • 轉化為2進制之後
    • 恰好是1位(bit)
  • 這是偶然的嗎?

ASCII 碼表趣事

  • 其實最初相差的并不是 0x20
    • 之前 ibm 的 EBCDIC 編碼也是這樣的
「oeasy」python0018_ ASCII_字元分布_數字
  • 也相差一個2進制位
「oeasy」python0018_ ASCII_字元分布_數字
  • EBCDIC問題是字母不連續
    • i、j之間不直接相連
  • EBCDIC最終被ascii所淘汰

ASCII

  • ASCII字母是連續的
    • 而且大小寫字母間
    • 相差正好是 1個 二進制位
    • 對應 b6 這個位
  • 那為什麼要差 1個 二進制位 呢?
「oeasy」python0018_ ASCII_字元分布_數字
  • 有了這種對應關系之後
    • 做大小寫不敏感的字元串查找就快多了
    • 這個 0x20 發生在 1963 年 5 月
      • The X3.2.4 task group voted its approval for the change to ASCII at its May 1963 meeting.
      • Locating the lowercase letters in columns 6 and 7 caused the characters to differ in bit pattern from the upper case by a single bit, which simplified case-insensitive character matching and the construction of keyboards and printers.
  • 當時的目的是
    • 降低大小寫不敏感字元串比對的難度
    • 降低打字機鍵盤的構造成本
  • 如果搜尋中遇到的是小寫字母
    • 修改1位之後
      • 小寫就都變成大寫
      • 不用查找對應關系表比對
    • 然後再觀察全大寫的情況下是否比對
  • 這就是大小寫字母的情況
    • 0x41-0x5A這個範圍是大寫字母
    • 0x61-0x7A這個範圍是小寫字母
  • 除了大小寫字母之外
    • 數字字元又是如何表示的呢?

ASCII 碼表範圍

「oeasy」python0018_ ASCII_字元分布_數字
  • 0x30-0x39這個範圍是數字
    • 數字的編碼減去0x30正好得到數字本身
    • 後四位剛好是BCD編碼模式
      • Binary-Coded Decimal
「oeasy」python0018_ ASCII_字元分布_數字
  • 我們再來看看 ASCII 除了字母和數字還有什麼?

各種符号

  • 各種符号是不連續的
「oeasy」python0018_ ASCII_字元分布_數字
  • 穿插在數字、字母周圍
    • sp 其實就是space(空格)
  • 表格最左邊是什麼呢?

ASCII

  • 0x20-0x7F 之間有各種真實字元
「oeasy」python0018_ ASCII_字元分布_數字
  • 0x00-0x1F 之間的東西是什麼?
    • 前兩列都是對應多個字元的
      • 具體含義目前還不知道
  • ASCII中的字元本來英語裡就有
    • 但是字元是英文字元、數字和标點
      • 怎麼編碼的呢?

ASCII由來

  • ASCII碼是由電報代碼發展而來的
「oeasy」python0018_ ASCII_字元分布_數字
  • 由貝爾資料服務公司推廣
「oeasy」python0018_ ASCII_字元分布_數字
  • 電報碼不是摩斯電碼嗎?

摩斯電碼

  • 更早之前确實是摩斯電碼
  • 下圖是他的編碼表
    • 分成長和短兩種信号,就是嘀和嗒
「oeasy」python0018_ ASCII_字元分布_數字
  • 《oeasy 教您玩轉電路基礎》第 18 話 裡面有介紹
    • 歡迎您有機會來看看oeasy電學、科學史那幾個系列
  • 還記得encode/decode中的code麼?
    • 曾經一度指的就是各種電報編碼彙編
    • 後來統一到摩斯電碼

摩斯電碼通信規則

  • 下圖是他的通信規則
    • 三個斷确認本字元結束了
    • 三個斷就是字元之間的分隔符
    • 錄入狀态并不是 0、1 兩種狀态
    • 而是長、短、暫停三種狀态
「oeasy」python0018_ ASCII_字元分布_數字
  • 編碼的原則是什麼呢?

效率問題

  • 編碼的規則是常用的字元點選次數少
    • 按照字元出現機率配置設定對應點選數量
      • T、E 出現頻率最高
      • 是以用一次點選電鍵的數量
    • 本質上是一棵霍夫曼樹
「oeasy」python0018_ ASCII_字元分布_數字
  • 當時發射和接收全靠人
    • 什麼叫長、什麼叫短、什麼叫斷
  • 發送者控制發報速度
    • 接收者跟着這個發報速度
    • 現查表是來不及的
    • 需要熟悉
      • 摩斯電碼碼表
      • 常用縮寫
  • 這摩斯電碼是3進制的編碼方式
  • 怎麼變成ascii這種0101的二進制編碼的呢?

總結

  • ASCII 由這樣幾類字元構成
    • 英文大寫字元
    • 英文小寫字元
    • 數字
    • 符号
  • 電報時代對于英文、數字的編碼
    • 使用的是摩斯電碼
「oeasy」python0018_ ASCII_字元分布_數字
  • 這摩斯電碼是3進制的編碼方式
    • 長短空
  • 怎麼演化成ascii這種0101的二進制編碼的呢?
  • 下次再說
  • 藍橋->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