什么是编码
字符串也是一種數據形態,但是比較特殊的是字符串本身也存在一個編碼的問題,就是如何讓計算機來表示相應的字符並存儲。在編程語言中,我們經常會處理文本編碼之間的轉化問題,因為文本可能存在不同的編碼格式,例如 ASCII、GBK、UTF-8等等。最近在做NN的過程中面臨Corpus的unicode編碼問題,因此需要弄清楚python不同版本對編碼問題的處理策略。
字符的抽象概念
看了一些網絡上的介紹,發現我們所謂的字符表示文本中單一的一個符號。然而一個字符不是一個字節,例如 “中” 這個字在文本中是一個基礎字符,但是在計算機中卻不是一個字節。一個字符有許多表示方法,不同的表示方法會使用不同的字節數,這就是所謂的編碼。字符就是文本中的最小單元。
編碼的方式
Unicode是一種編碼規範,用來統一表示世界上的各種語言。其作為Python語言中的一種中間轉換碼,如果要對不同編碼格式的文本進行轉換,就必須對字符串解碼(decode)成Unicode,再從Unicode編碼(encode)成另一種編碼格式:
decode
: 作用是將編碼的字符串轉換成Unicode。encode
: 作用是將Unicode傳換成其他編碼格式。
Python2 vs Python3
Python3的編碼形式默認為Unicode
- 那麼Python3的文本可以通過encode傳換成bytes嗎?bytes和str一樣嗎?
首先bytes不是字符串,那么b ‘a’ 和 ‘a’ 的区别是什么呢?在Python3运行输入出bytes的时候,它采取的原则是这样的:没读一个字节就和ascii码比对一下,如果符合ascii码的字符(特殊字符,字母和数字等除外),那这个字节就按照ascii码来表示,否则就按照十六进制‘\x’的形式来表示。
结果就如同图中所示 :
因此bytes对象不能由超过0到127的ascii码范围的unicode字
符串表示。
bytes的表示方式为b + (字符串),如果不用bytes表示,则直接用 ‘\x’ + 两位十六进制数表示一个字节。
- 那么在Python2表示unicode的时候我们使用u + (字符串)的形式表示unicode编码,而Python3中则无需这么做。
- 注意在Python3中u‘字符串’和‘\u四位十六进制数’是等价的,而且都为str对象。而‘\u四位十六进制数’和‘\u四位十六进制数’却不相同。
结果就如同图中所示 :