當(dāng)你在python中使用中文時,你一定見過下面的錯誤
SyntaxError: Non-ASCII character '\xe6' in file ./filename.py on line 3, but no encoding declared。
你一定聽過什么是編碼
比如,ascii,utf-8,gbk……。這些總的來說就是如何把一個字或者字母編碼成計算機(jī)能認(rèn)識的0和1
比如我舉“你好,python"這句話:
'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'(utf8)
'\xc4\xe3\xba\xc3\xa3\xacpython'(gbk)
至于ascii,不支持中文,寧打的化,就是錯誤:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
你必須要知道的string 和 unicode 區(qū)別
string object是由characters組成的sequence,而unicode object是Unicode code units組成的sequence。
unicode就是 Unicode code units組成的序列,比如還是上面那句話:
u'\u4f60\u597d\uff0cpython'
而至于string這貨,character是有多種編碼方式的,比如單字節(jié)的ASCII,雙字節(jié)的GB2312等等,再比如UTF-8。要想解讀string,必需知道string里的character是用哪種編碼方式,然后才能進(jìn)行因為編碼。
關(guān)于這些你要記住的只有一點:python所有編碼都以unicode作為中轉(zhuǎn)。 有了這句話,python編碼就不是問題了。
我還是舉上面那句話的例子:
print '你好,python'時發(fā)生了什么?
- python將'你好,python'轉(zhuǎn)換成了unicode即:
u'\u4f60\u597d\uff0cpython'
2.根據(jù)python的默認(rèn)編碼,把unicode轉(zhuǎn)換成相應(yīng)的編碼,這里是unicode->ascii。因為ascii不支持中文,所以就報了錯。
設(shè)定unicode轉(zhuǎn)換成哪種編碼的string
這很簡單,想沒有報錯,只要從unicode中轉(zhuǎn)時,轉(zhuǎn)換成系統(tǒng)的默認(rèn)編碼就行了。
比如linux的utf8下(win下,改成gbk就好):
utest=u'你好,python'
u'\u4f60\u597d\uff0cpython'
utestutf8=utest.encode("utf-8")
'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cpython'
這樣print utestutf8 就是'你好,python'
我不能每一次都用encode吧。
當(dāng)然,這個就是多數(shù)教程講的,設(shè)定默認(rèn)編碼的注釋: