1.請說明python2與python3的默認編碼是什么?
python的默認編碼是ASCII碼,python3的默認編碼是utf-8
2.為什么會出現中文亂碼?能列舉出現亂碼的情況有哪幾種么?
編碼的方式和解碼的方式不一致,就會出現亂碼現象。
比如:(1)文本內容是以gbk編碼的,但是解碼的方式卻是utf-8,就會亂碼
(2)文本內容是以ASCII進行編碼的,那就不支持中文,如果往文本中添加中文,就會顯示亂碼.
解決方法:用chardet獲取編碼格式
import chardet str = "xxxxx" str_type = chardet.detect(str) code = str_type['encoding']
code即為str的編碼格式。但有些人反映該方法得到的編碼格式不准確,速度也慢。本人親測,速度確實一般,但是目前還沒遇到不准確的情況。大家可以斟酌使用,我這里只是提供一個思路,如果誰那里有更好的方式,可以告知小弟,不吝賜教。
3.如何進行編碼轉換?
運用 encode(編碼)和decode(解碼)
decode是解碼,從二進制編碼格式到unicode編碼格式,解碼的格式需要以最開始編碼的方式一致,否則出現亂碼
encode是編碼,從unicode格式到二級制編碼格式(可以是gbk,utf-8等等)

1 # -*- coding:utf-8 -*- 2 3 str = "你好" #py3默認編碼是utf-8 4 print('unicode:', type(str),str) 5 str = bytes(str, encoding='utf-8') # 先編碼,轉換成bytes二進制類型 6 print(type(str), str) 7 str = str.decode("utf-8") #再解碼,若這個地方寫gbk,就會出現亂碼錯誤 8 print('用utf-8編碼成bytes類型,再解碼成unicode:',type(str), str) 9 str=str.encode("gbk") 10 str=str.decode('gbk') 11 print('用gbk編碼成unicode,再解碼:', type(str), str)
4. # -*- coding:utf-8 -*- 這句話的作用是什么?
文本編碼方式默認為utf-8
5.解釋py2 bytes vs py3 bytes的區別
(1)Python 3 所有的 strings 均是 unicode 類型,如果要轉換成bytes類型,則需要進行編碼聲明,比如:
str ⇒ bytes:bytes(s, encoding='utf8') bytes ⇒ str:s.decode('utf-8')
在python2.x 中是不區分bytes和str類型的,str的所有操作bytes都支持。但是在python3中bytes和str中是區分開的。
python2 中
>>> s = "abcdefg"
>>> b = s.encode() #或者使用下面的方式
>>> b = b"abcdefg"
>>> type(b)
<type 'str'>
python3中 #str和bytes是嚴格區分的
>>> s = "abcdefg"
>>> type(s)
<class 'str'>
>>> b = b"abcdefg"
>>> type(b)
<class 'bytes'>
str是文本系列,bytes是字節系列
文本是有編碼的(UTF-8,GBK,GB2312等)
字節沒有編碼
文本的編碼指的是字符如何使用字節來表示組織方式,linux下默認都使用UTF-8
(2)bytes與str之間的轉換-------編碼
bytes由str通過encode方法轉化得到的,str也可以通過bytes 通過decode方法轉化得到
通過b前綴可以定義bytes
GBK 是雙字節,UTF-8 靈活編碼,1字節,2字節,3字節,4字節都有,最大支持6字節長度,中文大多數是3字節
>>> S = "我是中國人"
>>> S
'我是中國人'
>>> b = S.encode() #進行編碼為bytes
>>> b
b'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> b.decode() #進行解碼為字符串
'我是中國人'
>>>
str被編碼成什么格式的,就需要使用什么格式的編碼進行解碼
>>> S = "我是中國人"
>>> S
'我是中國人'
>>> b = S.encode('GBK')
>>> b
b'\xce\xd2\xca\xc7\xd6\xd0\xb9\xfa\xc8\xcb'
>>> b.decode('GBK')
'我是中國人'
(3)bytes的操作
bytes具有string類型的所有操作,bytes可以通過str encode轉化,也可以通過前綴b定義
>>> b = b'abc'
>>> b
b'abc'
>>> b.decode()
'abc'
>>> len(('我是中國人').encode()) #求bytes的長度
15
>>> b
b'abc'
>>> b.hex() #轉化為16進制
'616263'
>>> bin(616263) #轉化為2進制
'0b10010110011101000111'
6.文件處理
(1)讀取文件是,r和rb的區別是什么?
對於 Python 3 環境:
r
:Python 將會按照編碼格式進行解析,read()
操作返回的是str
rb
:也即 binary mode,read()
操作返回的是bytes
(2)解釋一下open中三個參數的作用。
open(f_name,'r',encoding="utf-8")
第一個位置參數f_name指的是打開的文件的名字。
第二個位置參數‘r’指的是用讀模式打開。
第三個位置參數encoding='utf-8',指的是讀取文件的編碼格式為:utf-8