Python3.X-文本編碼問題


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)
View Code

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM