python 字元編碼

2022-07-17 04:00:14 字數 2443 閱讀 9539

一.字元編碼

計算機中,資料的儲存和運算都要使用二進位制(因為計算機用高、低電平分別表示1和0),那麼就需要乙個標準,將資料轉為二進位制表示

ascii碼就是一套標準,但是ascii只支援字母和字元的轉化,因為ascii碼是美國人提出來的,那麼中文,韓文,日文怎樣轉為二進位制呢?中國人規定了自己的標準gb2312編碼;日本人規定了自己的shift_jis編碼;南韓人規定了自己的euc-kr編碼,可是如果一篇文件上這三個國家的語言都出現了,該用哪乙個標準呢?unicode應運而生

ascii碼用1個位元組代表乙個字元

unicode常用兩個位元組代表乙個字元,生僻字需要4個位元組

這時候亂碼問題消失了,所有的文件我們都使用unicode,但是新問題出現了,如果我們的文件通篇都是英文,用unicode會比ascii耗費多一倍的空間,在儲存和傳輸上十分的低效

本著節約的精神,又出現了把unicode編碼轉化為「可變長編碼」的utf-8編碼。utf-8編碼把乙個unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文本母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文字包含大量英文本元,用utf-8編碼就能節省空間

二.編碼對應過程

記憶體中的編碼固定使用unicode,唯一可變的是硬碟上對應的字元編碼

1、在存入磁碟時,需要將unicode轉成一種更為精準的格式,utf-8將資料量控制到最精簡

2、在讀入記憶體時,需要將utf-8轉成unicode

所以我們需要明確:記憶體中用unicode是為了相容萬國軟體,即便是硬碟中有各國編碼編寫的軟體,unicode也有相對應的對映關係,但在現在的開發中,程式設計師普遍使用utf-8編碼了,估計在將來的某一天等所有老的軟體都淘汰掉了情況下,就可以變成:記憶體utf-8硬碟utf-8的形式了

三.亂碼問題

原因:1.存檔案的時候出現亂碼

檔案中有各個國家的文字,存的時候以shiftjis編碼去存,那麼不是日文的文字就會儲存失敗,使用shiftjis編碼開啟時,只有日文能顯示,其他會報錯

2.存檔案的時候正常,讀檔案的時候亂碼

存檔案時用utf-8編碼,保證相容萬國,不會亂碼,而讀檔案時選擇了錯誤的解碼方式,比如gbk,則在讀階段發生亂碼,讀階段發生亂碼是可以解決的,選對正確的解碼方式就ok了

解決辦法:

1、保證不亂嗎的核心法則就是,字元按照什麼標準而編碼的,就要按照什麼標準解碼,此處的標準指的就是字元編碼

2、在記憶體中寫的所有字元,一視同仁,都是unicode編碼,比如我們開啟編輯器,輸入乙個「你」,我們並不能說「你」就是乙個漢字,此時它僅僅只是乙個符號,該符號可能很多國家都在使用,根據我們使用的輸入法不同這個字的樣式可能也不太一樣。只有在我們往硬碟儲存或者基於網路傳輸時,才能確定」你「到底是乙個漢字,還是乙個日本字,這就是unicode轉換成其他編碼格式的過程了

四.應用 

執行程式的三個階段

python a.py (第一步將檔案內容讀入到記憶體中)

階段一:啟動python直譯器

需要在python檔案開頭指定用什麼格式讀入記憶體

例如:#coding:utf-8
階段三:讀取已經載入到記憶體的**(unicode模式),然後執行,執行過程中可能會開闢新的記憶體空間

但是程式在執行過程中,會申請記憶體(與程式**所存在的記憶體是倆個空間)用來存放python的資料型別的值,而python的字串型別又涉及到了字元的概念

比如x="hello",會被python直譯器識別為字串,會申請記憶體空間來存放字串型別的值,至於該字串型別的值被識別成何種編碼存放,這就與python直譯器的有關了,而python2與python3的字串型別又有所不同。

五.python2和python3字串型別的區別 

1.python2中有的兩種字串型別是str和unicode

假設 #coding:gbk

str1 = '你好' (str型別)

str2 = u'你好' (unicode型別)

str2 = str1.decode('gbk')

在終端列印的時候也需要與終端的編碼格式一致,在本例中,使用str型別時,如果終端編碼為gbk則可以正常顯示,如果終端為其他編碼則顯示會亂碼

對於unicode格式的資料來說,怎麼列印都不會亂碼

2.在python3 中也有兩種字串型別str和bytes

str就是unicode

假設 #coding:gbk

str1 = '你好' (str型別) #程式執行時,無需加上u,'你好'也會被以unicode形式儲存新的記憶體空間中

而在python3是bytes型別,在python2中則是str型別

python字元編碼

ascii 碼是乙個位元組,通常只能顯示英文本母和數字。unicode碼為了顯示多種語言產生,但是要占用兩個位元組,顯示文字要占用大量空間 utf 8 為了節約空間而生,英文本元只用乙個位元組儲存,中文字元需要三個位元組 character ascii unicode utf 8 a01000000...

python字元編碼

列印python檔案編碼 import sys print sys.getdefaultencoding 中文的乙個字元unicode占用2個位元組。對在於ascii字元占用1個位元組 utf 8中 中文字元佔3個位元組,英文本元占用1個位元組 編碼和轉碼 unicode不能再解碼了 它是基層的 u...

Python字元編碼

在用python程式設計中,字串有兩種表示方法 string 和 u string 為什麼字串要是用這兩種表達方式。不是僅僅用前一種呢?使用type 函式檢視,它們各自是str物件和unicode物件。這兩個物件有什麼差別嗎?還有經經常使用到的encode 和decode 又是幹什麼的呢?都說pyt...