python 基礎 字元編碼

2022-04-25 12:21:43 字數 4352 閱讀 8406

編碼基礎

由於每個國家都有自己的字元,所以其對應關係也涵蓋了自己國家的字元,但是以上編碼都存在侷限性,即:僅涵蓋本國字元,無其他國家字元的對應關係。應運而生出現了萬國碼,他涵蓋了全球所有的文字和二進位制的對應關係。

unicode 2-4位元組 已經收錄136690個字元,並還在一直不斷擴張中...

unicode 起到了2個作用:

直接支援全球所有語言,每個國家都可以不用再使用自己之前的舊編碼了,用unicode就可以了。(就跟英語是全球統一語言一樣)

unicode包含了跟全球所有國家編碼的對映關係

unicode解決了字元和二進位制的對應關係,但是使用unicode表示乙個字元,太浪費空間。例如:利用unicode表示「python」需要12個位元組才能表示,比原來ascii表示增加了1倍。

由於計算機的記憶體比較大,並且字串在內容中表示時也不會特別大,所以內容可以使用unicode來處理,但是儲存和網路傳輸時一般資料都會非常多,那麼增加1倍將是無法容忍的!!!

為了解決儲存和網路傳輸的問題,出現了unicode transformation format,學術名utf,即:對unicode中的進行轉換,以便於在儲存和網路傳輸時可以節省空間!

總結:utf 是為unicode編碼 設計 的一種 在儲存 和傳輸時節省空間的編碼方案。

字元在硬碟上的儲存都是 以二進位制的方式儲存的

編碼的轉換 

雖然國際語言是英語 ,但大家在自己的國家依然說自已的語言,不過出了國, 你就得會英語 編碼也一樣,雖然有了unicode and utf-8 ,但是由於歷史問題,各個國家依然在大量使用自己的編碼,比如中國的windows,預設編碼依然是gbk,而不是utf-8。

基於此,如果中國的軟體出口到美國,在美國人的電腦上就會顯示亂碼,因為他們沒有gbk編碼。

若想讓中國的軟體可以正常的在 美國人的電腦上顯示,只有以下2條路可走:

讓美國人的電腦上都裝上gbk編碼

把你的軟體編碼以utf-8編碼

第1種方法幾乎不可能實現,第2種方法比較簡單。 但是也只能是針對新開發的軟體。 如果你之前開發的軟體就是以gbk編碼的,上百萬行**可能已經寫出去了,重新編碼成utf-8格式也會費很大力氣。

so , 針對已經用gbk開發完畢的專案,以上2種方案都不能輕鬆的讓專案在美國人電腦上正常顯示,難道沒有別的辦法了麼?

有, 還記得我們講unicode其中乙個功能是其包含了跟全球所有國家編碼的對映關係,意思就是,你寫的是gbk的「路飛學城」,但是unicode能自動知道它在unicode中的「路飛學城」的編碼是什麼,如果這樣的話,那是不是意味著,無論你以什麼編碼儲存的資料,只要你的軟體在把資料從硬碟讀到記憶體裡,轉成unicode來顯示,就可以了。由於所有的系統、程式語言都預設支援unicode,那你的gbk軟體放到美國電腦上,載入到記憶體裡,變成了unicode,中文就可以正常展示啦。

python3  **的執行過程

在看實際**的例子前,我們來聊聊,python3 執行**的過程

直譯器找到**檔案,把**字串按檔案頭定義的編碼載入到記憶體,轉成unicode

把**字串按照語法規則進行解釋

所有的變數字元都會以unicode編碼宣告

實際**演示,在py3上 把你的**以utf-8編寫, 儲存,然後在windows上執行

**如下所示

#coding:utf-8

s = "路飛學成"

print(s)

在windows 下面執行如下圖所示

使用python3 在  windows 下面執行上述**是正常的

正常執行原因:  在python3裡   上面的utf-8編碼之所以能在windows gbk的終端下顯示正常,是因為到了記憶體裡python直譯器把utf-8轉成了unicode 

在python2 執行如下**檔案 py2_encode 

**如下所示 

#coding:utf-8

s = "路飛學成"

print(s)

使用 python2 ,在windows 下面執行是亂碼的

亂碼原因:python2直譯器僅以檔案頭宣告的編碼去解釋你的**,載入到記憶體後,並不會主動幫你轉為unicode,也就是說,你的檔案編碼是utf-8,載入到記憶體裡,你的變數字串就也是utf-8, 這意味著什麼你知道麼?。。。意味著,你以utf-8編碼的檔案,在windows是亂碼。要想使檔案正常顯示 需要做到以下兩個方面 1、字串 以gbk格式顯示,2、字串是unicode 編碼 

python3 自動把檔案轉換成unicode 編碼   主要是進行了 decode 解碼,和encode 編碼

utf-8 ---> decode 解碼---> unicode   unicode --->encode 編碼  ---> gbk/utf-8 

例項演示:

decode 解碼

#coding:utf-8

s = "路飛學成"

print(s)

s2 = s.decode('utf-8')

print(s2) # s2 以unicode 格式顯示,會正常顯示

encode 編碼

#coding:utf-8

s = "路飛學成"

print(s)

s2 = s.decode('utf-8')

print(s2)

print(type(s2))

print("***************===")

s3 = s2.encode('gbk') # 將unicode 編碼成gbk

print(s3)

print(type(s3)) # str

**執行如下所示

python2 中 

>>> s = "路飛"

>>> s

'\xc2\xb7\xb7\xc9'

但直接呼叫變數s,看到的卻是乙個個的16進製表示的二進位制位元組,我們怎麼稱呼這樣的資料呢?直接叫二進位制麼?也可以, 但相比於010101,這個資料串在表示形式上又把2進製轉成了16進製制來表示,這是為什麼呢? 哈,為的就是讓人們看起來更可讀。我們稱之為bytes型別,即位元組型別, 它把8個二進位制一組稱為乙個byte,用16進製制來表示, 嗯 ,是的,在python2裡,bytes == str , 其實就是一回事。 python2裡還有個單獨的型別是unicode , 把字串解碼後,就會變成unicode

>>> s = "路飛"

>>> s

'\xc2\xb7\xb7\xc9' #gbk 格式

>>> s.decode('gbk')

u'\u8def\u98de' #在unicode編碼表裡對應的位置

>>> print(s.decode('gbk'))

路飛 # #unicode 格式的字元

由於python創始人在開發初期認知的侷限性,其並未預料到python能發展成乙個全球流行的語言,導致其開發初期並沒有把支援全球各國語言當做重要的事情來做,所以就輕佻的把ascii當做了預設編碼。 當後來大家對支援漢字、日文、法語等語言的呼聲越來越高時,python於是準備引入unicode,但若直接把預設編碼改成unicode的話是不現實的, 因為很多軟體就是基於之前的預設編碼ascii開發的,編碼一換,那些軟體的編碼就都亂了。所以python 2 就直接 搞了乙個新的字元型別,就叫unicode型別,比如你想讓你的中文在全球所有電腦上正常顯示,在記憶體裡就得把字串存成unicode型別。

在python3 中  除了把字串的編碼改成了unicode, 還把str 和bytes 做了明確區分, str 就是unicode格式的字元, bytes就是單純二進位制啦。

>>> s = "路飛"

>>> s

'路飛'

>>> print(type(s))

# python3 中str 等於 py2 中的unicode 型別

>>> s.encode("gbk")

b'\xc2\xb7\xb7\xc9' # bytes 型別

最後乙個問題,為什麼在py3裡,把unicode編碼後,字串就變成了bytes格式? 你直接給我直接列印成gbk的字元展示不好麼?我想其實py3的設計真是煞費苦心,就是想通過這樣的方式明確的告訴你,想在py3裡看字元,必須得是unicode編碼,其它編碼一律按bytes格式展示

python 編碼常見排錯方式 

python基礎 字元編碼

任何乙個程式想要執行,必須先有硬碟載入到記憶體,然後由cpu去記憶體取只執行。執行著的應用程式的資料,必須在記憶體執行。python執行檔案的三步,首先把python檔案直譯器讀取到記憶體上,然後應用程式 文字檔案讀取到記憶體上,最後python直譯器對程式 進行編譯成計算機識別的 我們寫的檔案要想...

Python 基礎 字元編碼

python 直譯器在載入 py 檔案中的程式碼時,會對內容進行編碼 預設 ascill ascii american standard code for information interchange,美國資訊交換標準程式碼 是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和部分支援其他西歐...

python基礎之字元編碼

1.什麼是字元編碼?字元 標準 字元編碼 數字 2.為什麼要編碼?讓計算機認識人的字元 3.常見的字元編碼 ascii 乙個bytes代表乙個字元 英文本元 鍵盤上的所有其他字元 1bytes 8bit,8bit可以表示0 2 8 1種變化,即可表示256個字元 gbk 2bytes代表乙個字元,由...