python 字元編碼

2022-07-20 16:48:13 字數 4171 閱讀 7986

1、了解字元編碼的知識儲備。編輯器和終端中所有顯示的內容都屬於記憶體,記憶體使用的unicode

開啟編輯器就開啟了啟動了乙個程序,是在記憶體中的,所以在編輯器編寫的內容也都是存放與記憶體中的,斷電後資料丟失

因而需要儲存到硬碟上,點選儲存按鈕,就從記憶體中把資料刷到了硬碟上。

在這一點上,我們編寫乙個py檔案(沒有執行),跟編寫其他檔案沒有任何區別,都只是在編寫一堆字元而已。

2、字元編碼,將字元轉化為數字的功過稱之為編碼

階段一:現代計算機起源於美國,最早誕生也是基於英文考慮的ascii

ascii:乙個bytes代表乙個字元(英文本元/鍵盤上的所有其他字元),1bytes=8bit,8bit可以表示0-2**8-1種變化,即可以表示256個字元

ascii最初只用了後七位,127個數字,已經完全能夠代表鍵盤上所有的字元了(英文本元/鍵盤的所有其他字元)

後來為了將拉丁文也編碼進了ascii表,將最高位也占用了

階段二:為了滿足中文,中國人定製了gbk

gbk:2bytes代表乙個字元

為了滿足其他國家,各個國家紛紛定製了自己的編碼

日本把日文編到shift_jis裡,南韓把韓文編到euc-kr

階段三:各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文字中,顯示出來會有亂碼。

於是產生了unicode, 統一用2bytes代表乙個字元, 2**16-1=65535,可代表6萬多個字元,因而相容萬國語言

但對於通篇都是英文的文字來說,這種編碼方式無疑是多了一倍的儲存空間(二進位制最終都是以電或者磁的方式儲存到儲存介質中的)

於是產生了utf-8,對英文本元只用1bytes表示,對中文字元用3bytes

需要強調的一點是:

unicode:簡單粗暴,所有字元都是2bytes,優點是字元->數字的轉換速度快,缺點是占用空間大

utf-8:精準,對不同的字元用不同的長度表示,優點是節省空間,缺點是:字元->數字的轉換速度慢,因為每次都需要計算出字元需要多長的bytes才能夠準確表示

記憶體中使用的編碼是unicode,用空間換時間(程式都需要載入到記憶體才能執行,因而記憶體應該是盡可能的保證快)

硬碟中或者網路傳輸用utf-8,網路i/o延遲或磁碟i/o延遲要遠大與utf-8的轉換延遲,而且i/o應該是盡可能地節省頻寬,保證資料傳輸的穩定性。

無論是何種編輯器,要防止檔案出現亂碼

核心法則就是,檔案以什麼編碼儲存的,就以什麼編碼方式開啟

而檔案編碼儲存時候使用的編碼方式是右下角的編碼方式,而解碼的時候是使用文件開頭申明的編碼方式,兩種編碼不同的時候很容易出現亂碼的情況。

3、執行程式

python test.py   (我再強調一遍,執行test.py的第一步,一定是先將檔案內容讀入到記憶體中)

階段一:啟動python直譯器

此時,python直譯器會讀取test.py的第一行內容,#coding:utf-8,來決定以什麼編碼格式來讀入記憶體,這一行就是來設定python直譯器這個軟體的編碼使用的編碼格式這個編碼,

可以用sys.getdefaultencoding()檢視,如果不在python檔案指定頭資訊#-*-coding:utf-8-*-,那就使用預設的

python2中預設使用ascii,python3中預設使用utf-8

階段三:讀取已經載入到記憶體的**(unicode編碼的二進位制),然後執行,執行過程中可能會開闢新的記憶體空間,比如x="egon"

記憶體的編碼使用unicode,不代表記憶體中全都是unicode編碼的二進位制,

在程式執行之前,記憶體中確實都是unicode編碼的二進位制,比如從檔案中讀取了一行x="egon",其中的x,等號,引號,地位都一樣,都是普通字元而已,都是以unicode編碼的二進位制形式存放與記憶體中的

但是程式在執行過程中,會申請記憶體(與程式**所存在的記憶體是倆個空間),可以存放任意編碼格式的資料,比如x="egon",會被python直譯器識別為字串,會申請記憶體空間來存放"hello",然後讓x指向該記憶體位址,此時新申請的該記憶體位址儲存也是unicode編碼的egon,如果**換成x="egon".encode('utf-8'),那麼新申請的記憶體空間裡存放的就是utf-8編碼的字串egon了

針對python3如下圖

瀏覽網頁的時候,伺服器會把動態生成的unicode內容轉換為utf-8再傳輸到瀏覽器

如果服務端encode的編碼格式是utf-8, 客戶端記憶體中收到的也是utf-8編碼的二進位制。

4、python2與python3的區別

python3  str型別 和bytes

#

author : xiajinqi

#_*_ coding:utf8 _*_

#python3 中預設以uncode

str1 = '

劉亦菲'

#python3 當程式執行時,無需加u,'林'也會被以unicode形式儲存新的記憶體空間中,

str2= u'

劉亦菲'

#print

(type(str1),type(str2))

print(str1,str2) #

程式執行時候,str1,str2申請以unicode格式編碼儲存在記憶體空間張,列印終端也屬於記憶體。相當於從記憶體到記憶體,只是空間不同而已,編碼一直。因此永遠不會亂碼,並且不可以decode

str3 =str1.encode('

utf-8

') #

字串以utf8編碼轉化為位元組型別,儲存在記憶體空間

str4 =str1.encode('

gbk') #

字串以utf8編碼轉化為位元組型別,儲存在記憶體空間

print(str3,str4) #

e:\users\xiajinqi\pycharmprojects\twoday\venv\scripts\python.exe e:/users/xiajinqi/pycharmprojects/twoday/coding.py

'str

'>

'str

'>劉亦菲 劉亦菲b'

\xe5\x88\x98\xe4\xba\xa6\xe8\x8f\xb2

' b'

\xc1\xf5\xd2\xe0\xb7\xc6

'process finished with exit code 0

python2 str型別 和bytes

str1 = '

劉亦菲' #python3 當程式執行時,'林'

也會被以python檔案開頭指定的字元編碼進行編碼形式儲存新的記憶體空間中,因此只能decode 與python存在很大差異

str2= u'

劉亦菲'

##coding:utf-8

s=u'

林' #當程式執行時,'林'

會被以unicode形式儲存新的記憶體空間中

#s指向的是unicode,因而可以編碼成任意格式,都不會報encode錯誤

s1=s.encode('

utf-8')

s2=s.encode('

gbk'

)print s1 #列印正常否?

print s2 #列印正常否

print repr(s) #u

'\u6797

'print repr(s1) #

'\xe6\x9e\x97

' 編碼乙個漢字utf-8用3bytes

print repr(s2) #

'\xc1\xd6

'編碼乙個漢字gbk用2bytes

print type(s) #

'unicode

'>print type(s1) #

'str

'>print type(s2) #

'str

'>

總結:python3 和python2中的變數u都是以uncode編碼。因此無能如何列印,終端不會出現亂碼(因為終端是屬於記憶體,因此也是用uncode)。

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...