目錄python
字符是咱們人類可以讀懂的字符,想讓計算機讀懂這些字符,必需要通過如下過程:編程
字符--》翻譯過程--》數字(0101)編輯器
簡而言之,字符編碼就是將人類的字符翻譯成計算機可以識別的數字,這種轉換必須遵循一固定的標準,來表示字符與數字的對應關係,這個關係就是字符編碼表性能
早期由美國人發明,稱爲ASCIl。規定了一些數字和一些特殊符號的對應關係.ASCIl最多隻能表示256個符號,也就是256個對應關係編碼
早期用英文編程沒問題,ASCIl碼夠用,可是中國、韓國、日本也有本身的語言若是這時候還來用ASCIL碼來編碼各個國家的字符的時候就不能找到對應的關係了,就會出現亂碼的狀況。翻譯
因而,各個國家發明了他們屬於本身的編碼code
中國 gb23十二、gbkorm
韓國 euc-krblog
日本 shift內存
再讀取字符的時候按照各個國家的編碼標準會出現亂碼(由於此刻的各類標準都只是規定了本身國家的文字在內的字符跟數字的對應關係,若是單純採用一種國家的編碼格式,那麼其他國家語言的文字在解析時就會出現亂碼)。因此迫切須要一個世界的標準(能包含全世界的語言)
後來出現了把Unicode編碼轉化爲「可變長編碼」的UTF-8(Unicode Transformation Format-8)編碼。uft8佔用內存更小,更適合存儲數據。
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
啓動python解釋器
此時python解釋器就至關於一個純文本編輯器,默認是utf8編碼編寫字符
讀代碼
文本編輯器從硬盤中讀取內容默認使用utf8編碼格式讀取,若是不是utf8寫的字符讀取的時候則會亂碼
也能夠指定python解釋器讀取內容的編碼是什麼格式# coding=gbk
,這樣python解釋器就以gbk格式讀取,以gbk寫的字符就不會出現亂碼了。
加載到內存默認使用unicode編碼格式
執行,產生結果
執行過程當中會在內存中開闢新的內存空間
str
當python執行到產生字符串的代碼時,將字符串編碼成文件開頭指定的編碼格式
Unicode
當python執行到產生字符串的代碼時,在變量值前面加上u
表示用unicode編碼格式
Python3中字符串類型都是Unicode編碼的,因此Python3中的字符串類型的數據能夠編碼成其餘字符編碼的格式。
在Python3中不管指定了什麼字符編碼,在內存存取時都會使用Unicode編碼去入內存,Unicode編碼能夠和任意的字符編碼相互轉換,並在讀取時按照所需的編碼區讀取,這樣就很好解決了字符編碼的問題
字符按照什麼標準而編碼的,就要按照什麼標準解碼
(按照什麼方式存的,就按什麼方式取就不會亂碼)
爲了處理英文字符,產生了ASCII碼。
爲了處理中文字符,產生了GB2312。
爲了處理各國字符,產生了Unicode。
爲了提升Unicode存儲和傳輸性能,產生了UTF-8,它是Unicode的一種實現形式。
搞清楚了上面介紹的各類編碼格式以後,接下來咱們就開始詳細講解爲何會出現亂碼了。關於亂碼,你們記住兩個要點:
(1)所謂亂碼的本質是字符的編碼格式與顯示字符的環境編碼格式不一致引發的。這句話告訴咱們要解決亂碼問題,咱們須要知道兩個信息,一個是字符自己是什麼編碼,另外一個就是顯示字符的環境編碼是什麼,二者必須一致,才能顯示出正確的內容。
(2)因爲Unicode編碼是標準編碼格式,也能夠看作是沒有任何特定編碼格式的「無編碼」模式。因此,對於任何Unicode類型編碼的字符,打印時python會自動根據環境編碼轉爲特定編碼後再顯示。