關于Python字符編碼與二進制不得不說的一些事
二進制
核心思想:
馮諾依曼 + 圖靈機
電如何表示狀態(tài),才能穩(wěn)定?
計算機開始設計的時候并不是考慮簡單,而是考慮能自動完成任務與結果的可靠性,
簡單始終是建立再穩(wěn)定、可靠基礎上
經過嘗試10進制,但很難檢查電流的狀態(tài)差異并且很難穩(wěn)定狀態(tài),最穩(wěn)定的檢查是
通電和不通電狀態(tài),共兩種狀態(tài)那就規(guī)定 通電為 1 不通電 為 0,1和0的狀態(tài)邏
輯被稱為比特 Bit
那么如何用 0 和 1 表示數(shù)字和字符呢?
首先找出需要表示的字符,英文字符和數(shù)字字符才100多個,需要 7 個二進制位就
可以全部表示,但為了可擴展性,多出一位表示擴展,這就是ASCII碼
因為一個字符只需要最多8個二進制位表示,所以規(guī)定8個字節(jié)作為存儲單位,所有
8 Bit = 1 Byte
規(guī)定字符用數(shù)字表示,數(shù)字用二進制表示,也就是 字符 --> 數(shù)字 -- > 二進制,
那么文本信息就可以通過計算機存儲為二進制,計算機上存儲的二進制數(shù)可以逆轉
成文本信息
10 進制到二進制之間的關系轉換是固定的,那么字符到數(shù)字之間的轉換被我們稱為
字符編碼, ASCII碼 Unicode UTF-8 都是存儲字符與數(shù)字之間的映射關系
弄清楚幾個關系
1. 字符與數(shù)字之間的關系為映射關系,人為規(guī)定的標準
這種映射關系,生活中普遍存在,如
a. 身份證信息與身份證號碼
b. 數(shù)據(jù)庫id與該行信息
c. 訂單信息與訂單編號
d. 員工編號與員工
e. 字典的鍵與值
f. 內存地址與存儲在該地址上的值
...
2. 數(shù)字到二進制之間的關系,這個如同數(shù)學或物理定律一樣,固定轉換方式,寫死的
3. 8進制 16 進制都是建立在2進制的基礎上,和10進制之間沒有直接關系,主要為了
可讀性,二進制的兩種表示形式
如二進制 00000000 一個存儲單位,八進制000 000 000 每 3 個二進制位轉
換位10進制表示,最小數(shù)為 0 最大數(shù)為 7,所以取值范圍為 0 - 7
十六進制 0000 0000 每 4個二進制位轉換位10進制表示,最小位為0 最大為15,
所有取值范圍為 0 - 15,因為超出10機制表示范圍所以用 abcdef表示 10 11
12 13 14 15
十六進制常用于 內存地址表示 IPv6地址 顏色表 mac地址 二進制數(shù)據(jù)\x前綴b/B
IP地址(32位 點分十進制) x.x.x.x 每個x都是8個bit位表示的十進制數(shù)字
# 8進制 16進制是建立在二進制的基礎之上
Py進制轉換函數(shù)
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 = "你驕傲的飛遠,我棲息的夏天" # 獲得二進制數(shù)據(jù) byte_song = song.encode(encoding="utf-8") print(byte_song) # 二進制字符串轉文本字符串 print("二進制數(shù)據(jù)轉字符串".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進制,輾轉除法取余數(shù)
其他進制轉10進制是從右往左加上基數(shù)的指定次方然后求和
# 轉換方式像公式定律,固定
二進制表示
分為有符號和無符號類型,一般是 8 16 32 64 Bit 表示整數(shù)或浮點數(shù)
有符號最高位表示符號,就是最左邊的比特位,0表示正1表示負數(shù) 正負下標位0和1
有符號位表示范圍,因為要分成兩半,一半表示正數(shù)一半表示負數(shù),
說白了是去除一位表示符號位 -2**(n-1) - 2**n(n-1) -1, n = 8/16/32/64
無符號位表示 0到2**n -1
# 長度不一樣,分為1/2/4/8字節(jié)
Py字符對應ASCII數(shù)字函數(shù)
ord()
字符編碼
語言文字 ---> 數(shù)字 ---> 0 1二進制
# 這個映射關系表被稱為字符編碼
# 字符編碼解決的問題是字符與十進制之間映射關系,人為定義的
中國 gb2312 -> GBK 中文2字節(jié),英文1個字節(jié)
國際 Unicode(2-4個字節(jié)) -> UTF-8(1-4個字節(jié))
1. 支持全球語言字符
2. 包含全球字符編碼映射
# 全球各國語言可以轉成Unicode,Unicode可以轉全球各個國家語言
3. 全球軟/硬件都支持Unicode
主流 UTF-8
因為Unicode表示一個字符需要至少2個字節(jié),那么原來用ASCII只需要一個字節(jié),
現(xiàn)在使用Unicode編碼則存儲與進行網(wǎng)絡傳輸需要的存儲空間直接翻倍,不可接受
UTF-8為了解決這個問題,于是走上了歷史舞臺,那好,網(wǎng)絡傳輸和存儲使用
UTF-8,操作系統(tǒng)支持Unicode,那么高效傳輸、存儲和支持全球語言體系成為可能
Python中編碼
首先說說Python中編碼到底是何方神圣?
我們看存儲代碼的文件和代碼加載到內存然后被解釋器處理的文件
我們敲的代碼,其實本質上是文本數(shù)據(jù)
文本數(shù)據(jù)要通過某一編碼表轉換成二進制然后存儲到硬盤上
存儲在電腦上的二進制數(shù)據(jù)也需要編碼表才能轉換成文本數(shù)據(jù)
Python中編碼是怎么回事?
Py3中默認文件編碼為UTF-8, 我們通過編輯器編輯文件的時候也會有個默認編碼
一般默認為UTF-8,如果定義的文件中文本數(shù)據(jù)不是以UTF-8編碼,則需要在Py文
件的頭行告訴Py解釋器這個文件是以何種編碼。
解釋器讀取的并不是我們看到的編輯器里面的文本數(shù)據(jù),而是存儲在硬盤上的01
一樣的二進制數(shù)據(jù),解釋器嘗試用默認UTF-8編碼解碼讀取到硬盤中的二進制數(shù)
據(jù),轉換成文件數(shù)據(jù),如果非默認utf-8則出現(xiàn)亂碼,解釋器對文本數(shù)據(jù)解析失敗,
則需要在Py源文件開頭指定當前文件的編碼格式,告訴Py解釋器如何去轉換該文件
Py解釋器默認編碼是Unicode,解釋器會把讀取到的二進制數(shù)據(jù)通過字符編碼轉
換成文件數(shù)據(jù)然后再次轉換為Unicode編碼,只要操作系統(tǒng)支持Unicode,解釋器
都能正常執(zhí)行并輸出結果
解釋器
二進制數(shù)據(jù) -> 查字符編碼表 -> 文本數(shù)據(jù) -> Unicode編碼的文本數(shù)據(jù)
編輯器
二進制數(shù)據(jù) -> 查字符編碼表 -> 對應編碼表的文本數(shù)據(jù)
# 解釋器和編輯器都是從文件的二進制數(shù)據(jù)開始的,通過編碼轉換成對應的文本
# 數(shù)據(jù),不過解釋器會會在文件數(shù)據(jù)的基礎上解析文本數(shù)據(jù)成底層機器指令并執(zhí)行
需要弄清楚的是Py源文件編碼和Py解釋器默認編碼不一致
# Py源文件編碼默認UTF-8,Py解釋器默認編碼為Unicode
那么,產生亂碼的解決問題的思路就很好解決了
# 亂碼 - 字符編碼指定錯誤,存儲的二進制轉換成文本文件選擇的字符集錯誤
1. C/S 架構的軟件,檢查 Client 和 Server默認編碼是否一致
2. Web后端,數(shù)據(jù)庫默認編碼、表的編碼和各個語言連接數(shù)據(jù)庫接口的編碼是否一致
3. 文件,檢查編輯器的默認編碼是否和文件初始編碼一致,什么編碼就存什么編碼讀
Python聲明源文件字符編碼的方式
1. # conding:utf-8
2. # -*- conding:utf-8 -*-
# 都是以 # 開頭,寫在源文件頂行
# -*- coding:utf-8 -*- # coding: utf-8
總結
到此這篇關于關于Python字符編碼與二進制不得不說的一些事的文章就介紹到這了,更多相關Python字符編碼與二進制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python網(wǎng)絡編程之使用TCP方式傳輸文件操作示例
這篇文章主要介紹了Python網(wǎng)絡編程之使用TCP方式傳輸文件操作,結合實例形式分析了使用socket模塊進行tcp協(xié)議下文件傳輸?shù)脑硪约胺掌鞫恕⒖蛻舳讼嚓P實現(xiàn)技巧,需要的朋友可以參考下2019-11-11使用 Python 讀取電子表格中的數(shù)據(jù)實例詳解
這篇文章主要介紹了使用 Python 讀取電子表格中的數(shù)據(jù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04使用Python opencv實現(xiàn)視頻與圖片的相互轉換
這篇文章主要介紹了使用Python opencv實現(xiàn)視頻與圖片的相互轉換,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07