目的:在處理字符時,如果編碼和解碼處理不當,就會出現亂碼。
環境:ubuntu 16.04 python 3.5.2
情景:因爲工作,需要寫了一個自動接收郵件並針對特定內容導出到表格的腳本,但收到的郵件源信息一般都是字節信息,需要解碼處理,即decode, 如果要發送郵件就需要使用編碼encode。
函數:
str.decode('解碼方式')
str.encode('編碼方式')
這裏decode接收字符串,並以指定的解碼方式解碼,如utf-8或gb2312,encode也是相同的操作。如果給的編碼或解碼方式錯誤,則會彈出UnicodeDecodeError:錯誤,可以用try---except來捕捉處理。
以下:
def decode_str(_str): try: _change_str = _str.decode('gb2312') except UnicodeDecodeError: _change_str = _str.decode('utf-8')
一般微軟中文操作系統都是gb2312的。
再寫一點枯燥的筆記:
字符編碼,早期有美國人發明,定製了ASCII編碼,只包含大小寫字母、數字和一些符號,這樣對其他語言的支持明顯不夠,中文一般需要兩個字節,且不能與ASCII衝突,所以定製了GB2312用於中文,其他國家也有自己的編碼,爲了統一,Unicode應運而生,包含了所以不同的編碼,但是在表示ACSII字符是多加了空的字節,浪費存儲和傳輸,於是有了UTF-8,常見英文用一個字節,漢字通常用3個(Unicode用2個),兼容ASCII。現在傳輸和存儲用UTF-8,內存和服務用Unicode。
參看資料: