在程式碼中會看到encode, decode, utf-8幾個關鍵字
例如:adapters.py
當中的build_response方法
if isinstance(req.url, bytes):
response.url = req.url.decode('utf-8')
else:
response.url = req.url
models.py
當中的prepare_body方法
if not data and json is not None:
# urllib3 requires a bytes-like body. Python 2's json.dumps
# provides this natively, but Python 3 gives a Unicode string.
content_type = 'application/json'
body = complexjson.dumps(json)
if not isinstance(body, bytes):
body = body.encode('utf-8')
或是auth.py
中的build_digest_header方法
def md5_utf8(x):
if isinstance(x, str):
x = x.encode('utf-8')
return hashlib.md5(x).hexdigest()
到底encode, decode和utf-8之間的關係是甚麼呢?
計算機本質上僅認識二進位數字,那你現在看到的文字(英文大小寫、中文字、標點符號)是怎麼在計算機之間(伺服器、客戶端)儲存和傳輸的呢?
需要透過一種你知、我知、獨眼龍也知
的字元編碼方式
(character encodings),幫助對應字元與數字之間的關係。
早期,你、我和獨眼龍各自有自己的字元編碼方式,但可能會造成你不認識我和獨眼龍的編碼方式,造成在我和獨眼龍的環境上可以跑的資料但到了你的環境後卻是亂碼的窘境。
這個時候,一統江湖的Unicode
出現了
Unicode provides a unique number for every character, no matter what the platform, program, or language is.
目前最新版本為12.1.0
範圍: U+0000 - U+10FFFF,可以表示1114112(65536 * 17)個獨立的字元
可分為17個Unicode Planes,第0個Plane: Basic Multilingual Plane(BMP)包含常用的語言符號
中文所在的範圍就出現在這個Plane: CJK Unified Ideographs, U+4E00 - U+9FFF
鐵人賽的Unicode表示為U+9435 U+4EBA U+8CFD
UTF-8就是一種以8位元為單元對Unicode進行編碼的方式,針對不同範圍的Unicode所使用的位元組長度是可變動的,ASCII只要使用1個位元組而中文需要3個位元組。
UTF-8沒有Byte Order(Little endian, Big endian)的問題,所以實際上若使用該編碼方式,並不需要BOM(Byte Order Mark)做進一步指示,BOM的Unicode表示為U+FEFF,又稱為Zero Width No-Break Space,使用UTF-8編碼後為0xEF 0xBB 0xBF