看了好幾篇編碼的文章,表示還是理不順。。僅做一些記錄。
一、unicode和utf-8
unicode記錄了全球的所有語言,包含了跟全球所有國家編碼的映射關係。但是都用unicode來表示編碼太佔空間,就創建了其他的編碼方案,如utf-8。
utf-8是根據內容來動態分配字節數記錄內容。使用1、2、3、4個字節表示所有字符,優先使用1個字符、無法滿足則使增加一個字節,最多4個字節。英文佔1個字節、歐洲語系佔2個、東亞語系佔3個,其它及特殊字符佔4個。
二、字符的記錄
要注意:
- 無論以什麼編碼在內存裏顯示字符,存到硬盤上都是2進制
- 存到硬盤上時是以何種編碼存的,再從硬盤上讀出來時,就必須以何種編碼讀(開頭聲明或轉換),要不然就亂了
三、python中編碼的轉換
python中版本2和3的處理是不一樣的,python3默認編碼是unicode,python2默認編碼是ascii碼。
- Python3執行過程
- 解釋器找到代碼文件,把代碼字符串按文件頭定義的編碼加載到內存,轉成unicode
- 把代碼字符串按照語法規則進行解釋
- 所有的變量字符都會以unicode編碼聲明
- python2幾個要點
- python2的默認編碼是ascii碼,所以無法支持中文,若文件中有中文,如註釋或處理,必須聲明文件頭編碼,如:#-*- coding:utf-8 -*-
- python2可以調用函數實現unicode和utf-8/gbk等中間的轉換,方法爲:
utf-8/gbk ---> decode('原始編碼') -->unicode編碼
unicode編碼 --->encode('編碼類型') --- >指定編碼
eg:#-*- coding:utf-8 -*- aaa=u"你好" print aaa print aaa.encode("utf-8") print aaa.encode("gbk") print "+++++++++++++++++++++++++" bbb = "試試看" print bbb print bbb.decode("utf-8") print bbb.decode("utf-8").encode("gbk")
在windows的輸出結果:
我的代碼設置爲utf-8編碼,windows的編碼則是gbk
因爲aaa定義爲unicode編碼,所以能在windows下顯示,轉爲utf-8則亂碼;
默認的bbb是utf-8編碼,所以要轉爲unicode或gbk才能顯示 - string和unicode,是不同類型,無法拼接,若要拼接必須統一類型。
若在程序中需要處理某個字段,可以用函數type()獲取其是unicode類型還是str類型。
eg:
str類型和unicode類型之間的互轉參考上面第2點
eg:
參考文章: