iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
0

在程式碼中會看到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

參考


上一篇
Day27-python-yield-2
下一篇
Day29-python-class-Special method names
系列文
Why it works: python requests and urllib330
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言