Python字符編碼和二進制不得不說的故事

二進制python

核心思想:
  馮諾依曼 + 圖靈機數據庫

  電如何表示狀態,才能穩定?
    計算機開始設計的時候並非考慮簡單,而是考慮能自動完成任務與結果的可靠性,
    簡單始終是創建再穩定、可靠基礎上後端

    通過嘗試10進制,但很難檢查電流的狀態差別而且很難穩定狀態,最穩定的檢查是
    通電和不通電狀態,共兩種狀態那就規定 通電爲 1 不通電 爲 0,1和0的狀態邏
    輯被稱爲比特 Bit網絡

  那麼如何用 0 和 1 表示數字和字符呢?
    首先找出須要表示的字符,英文字符和數字字符才100多個,須要 7 個二進制位就
    能夠所有表示,但爲了可擴展性,多出一位表示擴展,這就是ASCII碼架構

    由於一個字符只須要最多8個二進制位表示,因此規定8個字節做爲存儲單位,全部
    8 Bit = 1 Byte編輯器

    規定字符用數字表示,數字用二進制表示,也就是 字符 --> 數字 -- > 二進制
    那麼文本信息就能夠經過計算機存儲爲二進制,計算機上存儲的二進制數能夠逆轉
    成文本信息函數

    10 進制到二進制之間的關係轉換是固定的,那麼字符到數字之間的轉換被咱們稱爲
    字符編碼, ASCII碼 Unicode UTF-8 都是存儲字符與數字之間的映射關係編碼

 

弄清楚幾個關係
  1. 字符與數字之間的關係爲映射關係,人爲規定的標準
      這種映射關係,生活中廣泛存在,如
    a. 身份證信息與身份證號碼
    b. 數據庫id與該行信息
    c. 訂單信息與訂單編號
    d. 員工編號與員工
    e. 字典的鍵與值
    f. 內存地址與存儲在該地址上的值
    ...
  2. 數字到二進制之間的關係,這個如同數學或物理定律同樣,固定轉換方式,寫死的spa

  3. 8進制 16 進制都是創建在2進制的基礎上,和10進制之間沒有直接關係,主要爲了
   可讀性,二進制的兩種表示形式
   如二進制 00000000 一個存儲單位,八進制000 000 000 每 3 個二進制位轉
   換位10進製表示,最小數爲 0 最大數爲 7,因此取值範圍爲 0 - 7
   十六進制 0000 0000 每 4個二進制位轉換位10進製表示,最小位爲0 最大爲15,
   全部取值範圍爲 0 - 15,由於超出10機制表示範圍因此用 abcdef表示 10 11
   12 13 14 15操作系統

   十六進制經常使用於 內存地址表示 IPv6地址 顏色表 mac地址 二進制數據\x前綴b/B

    IP地址(32位 點分十進制) x.x.x.x 每一個x都是8個bit位表示的十進制數字

  # 8進制 16進制是創建在二進制的基礎之上

 

Py進制轉換函數
  10進制轉其餘進制
    轉2進制 bin 前綴0b
    轉16進制 hex 前綴0x
    轉8進制 oct 前綴0o
    # 二進制 八進制 十六進制都是經過帶前綴的字符串形式"0b/o/x..."

# 10 進制轉其餘進制
number = 9999
print("10進制轉其餘進制".ljust(40, "*"))
# 10 進制轉2進制
b_number = bin(number)
print("二進制:", b_number)
# 10進制轉8進制
o_number = oct(number)
print("八進制:", o_number)
# 10進制轉16進制
h_number = hex(number)
print("十六進制:", h_number)

  其餘進制轉10進制 int(..., base) base指定進制

# 10 進制轉其餘進制
number = 9999
print("10進制轉其餘進制".ljust(40, "*"))
# 10 進制轉2進制
b_number = bin(number)
print("二進制:", b_number)
# 10進制轉8進制
o_number = oct(number)
print("八進制:", o_number)
# 10進制轉16進制
h_number = hex(number)
print("十六進制:", h_number)

# 其餘進制轉10進制
# 2進制轉10進制
num_b = int(b_number, base=2)
print(num_b)
# 8 進制轉10進制
num_o = int(o_number, base=8)
print(num_o)
# 8 進制轉16進制
num_h = int(h_number, base=16)
print(num_h)

  字符串轉二進制字符串
    bytes
    encode
    須要指定字符編碼,結果前綴爲 b/B"..."

# 字符串轉二進制字符串
song = "你驕傲的飛遠,我棲息的夏天"

byte_song = song.encode(encoding="utf-8")
print(byte_song)
# 等價於
eq_byte_song = bytes(song, encoding="utf-8")
print(eq_byte_song)
print(byte_song == eq_byte_song)

  二進制轉字符串
    decode
    str
    須要指定字符編碼

# 二進制轉字符串
song = "你驕傲的飛遠,我棲息的夏天"
# 得到二進制數據
byte_song = song.encode(encoding="utf-8")
print(byte_song)

# 二進制字符串轉文本字符串
print("二進制數據轉字符串".rjust(40, "_"))
dec_song = byte_song.decode(encoding="utf-8")
print(dec_song)
# 等價於'
str_song = str(byte_song, encoding="utf-8")
print(str_song)
print(dec_song == str_song)

  算術方法
    10進制轉2 8 16進制,展轉除法取餘數
    其餘進制轉10進制是從右往左加上基數的指定次方而後求和
    # 轉換方式像公式定律,固定

 

二進制表示
  分爲有符號和無符號類型,通常是 8 16 32 64 Bit 表示整數或浮點數
  有符號最高位表示符號,就是最左邊的比特位,0表示正1表示負數 正負下標位0和1
  有符號位表示範圍,由於要分紅兩半,一半表示正數一半表示負數,
  說白了是去除一位表示符號位 -2**(n-1) - 2**n(n-1) -1, n = 8/16/32/64
  無符號位表示 0到2**n -1
  # 長度不同,分爲1/2/4/8字節


Py字符對應ASCII數字函數

  ord()

 

字符編碼
  語言文字 ---> 數字 ---> 0 1二進制
  # 這個映射關係表被稱爲字符編碼
  # 字符編碼解決的問題是字符與十進制之間映射關係,人爲定義的

  中國 gb2312 -> GBK 中文2字節,英文1個字節
  國際 Unicode(2-4個字節) -> UTF-8(1-4個字節)
    1. 支持全球語言字符
    2. 包含全球字符編碼映射
    # 全球各國語言能夠轉成Unicode,Unicode能夠轉全球各個國家語言
    3. 全球軟/硬件都支持Unicode

  主流 UTF-8
    由於Unicode表示一個字符須要至少2個字節,那麼原來用ASCII只須要一個字節,
    如今使用Unicode編碼則存儲與進行網絡傳輸須要的存儲空間直接翻倍,不可接受

    UTF-8爲了解決這個問題,因而走上了歷史舞臺,那好,網絡傳輸和存儲使用
    UTF-8,操做系統支持Unicode,那麼高效傳輸、存儲和支持全球語言體系成爲可能

 

Python中編碼
  首先說說Python中編碼究竟是何方神聖?
  咱們看存儲代碼的文件和代碼加載到內存而後被解釋器處理的文件
  咱們敲的代碼,其實本質上是文本數據
  文本數據要經過某一編碼表轉換成二進制而後存儲到硬盤上
  存儲在電腦上的二進制數據也須要編碼表才能轉換成文本數據



Python中編碼是怎麼回事?
  Py3中默認文件編碼爲UTF-8, 咱們經過編輯器編輯文件的時候也會有個默認編碼
  通常默認爲UTF-8,若是定義的文件中文本數據不是以UTF-8編碼,則須要在Py文
  件的頭行告訴Py解釋器這個文件是以何種編碼。

  解釋器讀取的並非咱們看到的編輯器裏面的文本數據,而是存儲在硬盤上的01
  同樣的二進制數據,解釋器嘗試用默認UTF-8編碼解碼讀取到硬盤中的二進制數
  據,轉換成文件數據,若是非默認utf-8則出現亂碼,解釋器對文本數據解析失敗,
  則須要在Py源文件開頭指定當前文件的編碼格式,告訴Py解釋器如何去轉換該文件

  Py解釋器默認編碼是Unicode,解釋器會把讀取到的二進制數據經過字符編碼轉
  換成文件數據而後再次轉換爲Unicode編碼,只要操做系統支持Unicode,解釋器
  都能正常執行並輸出結果

  解釋器
    二進制數據 -> 查字符編碼表 -> 文本數據 -> Unicode編碼的文本數據
  編輯器
    二進制數據 -> 查字符編碼表 -> 對應編碼表的文本數據
  # 解釋器和編輯器都是從文件的二進制數據開始的,經過編碼轉換成對應的文本
  # 數據,不過解釋器會會在文件數據的基礎上解析文本數據成底層機器指令並執行

  須要弄清楚的是Py源文件編碼和Py解釋器默認編碼不一致
  # Py源文件編碼默認UTF-8,Py解釋器默認編碼爲Unicode



那麼,產生亂碼的解決問題的思路就很好解決了
  # 亂碼 - 字符編碼指定錯誤,存儲的二進制轉換成文本文件選擇的字符集錯誤
  1. C/S 架構的軟件,檢查 Client 和 Server默認編碼是否一致
  2. Web後端,數據庫默認編碼、表的編碼和各個語言鏈接數據庫接口的編碼是否一致
  3. 文件,檢查編輯器的默認編碼是否和文件初始編碼一致,什麼編碼就存什麼編碼讀

 

Python聲明源文件字符編碼的方式
  1. # conding:utf-8
  2. # -*- conding:utf-8 -*-
  # 都是以 # 開頭,寫在源文件頂行

# -*- coding:utf-8 -*-
# coding: utf-8
相關文章
相關標籤/搜索