歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python3 是如何解決棘手的字符編碼問(wèn)題的?

發(fā)布時(shí)間:2017-08-10 15:44  回復(fù):0  查看:2530   最后回復(fù):2017-08-10 15:44  
Python3  最重要的一項(xiàng)改進(jìn)之一就是解決了  Python2  中字符串與字符編碼遺留下來(lái)的這個(gè)大坑。本文就和大家一起來(lái)扒一扒python3 是如何解決的字符編碼問(wèn)題,希望對(duì)大家 學(xué)習(xí)python3有所幫助。
Python2  字符串設(shè)計(jì)上的一些缺陷:
  ·  使用  ASCII  碼作為默認(rèn)編碼方式,對(duì)中文處理很不友好。
  ·  把字符串的牽強(qiáng)地分為  unicode  和  str  兩種類型,誤導(dǎo)開發(fā)者
  當(dāng)然這并不算 Bug ,只要處理的時(shí)候多留心也可以避免這些坑。但在  Python3  兩個(gè)問(wèn)題都很好的解決了。
  首先,Python3  把系統(tǒng)默認(rèn)編碼設(shè)置為  UTF-8
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>>
  然后,文本字符和二進(jìn)制數(shù)據(jù)區(qū)分得更清晰,分別用 str  和  bytes  表示。文本字符全部用  str  類型表示, str  能表示 Unicode  字符集中所有字符,而二進(jìn)制字節(jié)數(shù)據(jù)用一種全新的數(shù)據(jù)類型,用  bytes  來(lái)表示。
   str
  >>> a = "a">>> a'a'>>> type(a)
  < class ' str'>
  >>> b = " ">>> b' '>>> type(b)
  < class ' str'>
   bytes
  Python3  中,在字符引號(hào)前加 ‘b’ ,明確表示這是一個(gè)  bytes  類型的對(duì)象,實(shí)際上它就是一組二進(jìn)制字節(jié)序列組成的數(shù)據(jù), bytes  類型可以是  ASCII 范圍內(nèi)的字符和其它十六進(jìn)制形式的字符數(shù)據(jù),但不能用中文等非 ASCII 字符表示。
  >>> c = b'a'>>> c
  b'a'>>> type(c) class ' bytes'>
  >>> d = b'\xe7\xa6\x85'>>> d
  b'\xe7\xa6\x85'>>> type(d) class ' bytes'>>>>
  >>> e = b' '
  File "", line 1SyntaxError: bytes can only contain ASCII literal characters.
  bytes  類型提供的操作和  str  一樣,支持分片、索引、基本數(shù)值運(yùn)算等操作。但是  str  與  bytes  類型的數(shù)據(jù)不能執(zhí)行  + 操作,盡管在py2 中是可行的。
  >>> c = b'a'>>> c
  b'a'>>> type(c)
  < class ' bytes'>
  >>> d = b'\xe7\xa6\x85'>>> d
  b'\xe7\xa6\x85'>>> type(d)
  < class ' bytes'>>>>
  >>> e = b' '
  File "", line 1SyntaxError: bytes can only contain ASCII literal characters.
  python2  與  python3  字節(jié)與字符的對(duì)應(yīng)關(guān)系
Python3&nbsp;是如何解決棘手的字符編碼問(wèn)題的?
   encode 與 decode
  str  與  bytes  之間的轉(zhuǎn)換可以用  encode  和從 decode  方法。
Python3&nbsp;是如何解決棘手的字符編碼問(wèn)題的?
  encode  負(fù)責(zé)字符到字節(jié)的編碼轉(zhuǎn)換。默認(rèn)使用  UTF-8  編碼準(zhǔn)換。
>>> s = "Python 之禪 "
>>> s.encode()
b'Python\xe4\xb9\x8b\xe7\xa6\x85'
>>> s.encode("gbk")
  b'Python\xd6\xae\xec\xf8'
  decode  負(fù)責(zé)字節(jié)到字符的解碼轉(zhuǎn)換,通用使用  UTF-8  編碼格式進(jìn)行轉(zhuǎn)換。
>>> b'Python\xe4\xb9\x8b\xe7\xa6\x85'.decode()
'Python 之禪 '
>>> b'Python\xd6\xae\xec\xf8'.decode("gbk")
'Python 之禪 '
來(lái)源: 伯樂(lè)在線
您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?