一個字符不等價于一個字節(jié),字符是人類能夠識別的符號,而這些符號要保存到計算的存儲中就需要用計算機能夠識別的字節(jié)來表示。一個字符往往有多種表示方法,不同的表示方法會使用不同的字節(jié)數(shù)。這里所說的不同的表示方法就是指字符編碼,比如字母A-Z都可以用ASCII碼表示(占用一個字節(jié)),也可以用UNICODE表示(占兩個字節(jié)),還可以用UTF-8表示(占用一個字節(jié))。字符編碼的作用就是將人類可識別的字符轉(zhuǎn)換為機器可識別的字節(jié)碼,以及反向過程。
UNICDOE才是真正的字符串,而用ASCII、UTF-8、GBK等字符編碼表示的是字節(jié)串。關(guān)于這點,我們可以在Python的官方文檔中經(jīng)常可以看到這樣的描述"Unicode string" , " translating a Unicode string into a sequence of bytes"
我們寫代碼是寫在文件中的,而字符是以字節(jié)形式保存在文件中的,因此當我們在文件中定義個字符串時被當做字節(jié)串也是可以理解的。但是,我們需要的是字符串,而不是字節(jié)串。一個優(yōu)秀的編程語言,應該嚴格區(qū)分兩者的關(guān)系并提供巧妙的完美的支持。JAVA語言就很好,以至于了解Python和PHP之前我從來沒有考慮過這些不應該由程序員來處理的問題。遺憾的是,很多編程語言試圖混淆“字符串”和“字節(jié)串”,他們把字節(jié)串當做字符串來使用,PHP和Python2都屬于這種編程語言。最能說明這個問題的操作就是取一個包含中文字符的字符串的長度:
- 對字符串取長度,結(jié)果應該是所有字符串的個數(shù),無論中文還是英文
- 對字符串對應的字節(jié)串取長度,就跟編碼(encode)過程使用的字符編碼有關(guān)了(比如:UTF-8編碼,一個中文字符需要用3個字節(jié)來表示;GBK編碼,一個中文字符需要2個字節(jié)來表示)
注意:Windows的cmd終端字符編碼默認為GBK,因此在cmd輸入的中文字符需要用兩個字節(jié)表示
>>> # Python2
>>> a = 'Hello,中國' # 字節(jié)串,長度為字節(jié)個數(shù) = len('Hello,')+len('中國') = 6+2*2 = 10
>>> b = u'Hello,中國' # 字符串,長度為字符個數(shù) = len('Hello,')+len('中國') = 6+2 = 8
>>> c = unicode(a, 'gbk') # 其實b的定義方式是c定義方式的簡寫,都是將一個GBK編碼的字節(jié)串解碼(decode)為一個Uniocde字符串
>>>
>>> print(type(a), len(a))
(, 10)
>>> print(type(b), len(b))
(, 8)
>>> print(type(c), len(c))
(, 8)
>>>
Python3中對字符串的支持做了很大的改動。
-
編碼
+關(guān)注
關(guān)注
6文章
935瀏覽量
54761 -
字符
+關(guān)注
關(guān)注
0文章
232瀏覽量
25173 -
python
+關(guān)注
關(guān)注
56文章
4782瀏覽量
84453
發(fā)布評論請先 登錄
相關(guān)推薦
評論