当你在python中使用中文时,你一定见过下面的错误
SyntaxError: Non-ASCII character '\xe6' in file ./filename.py on line 3, but no encoding declared。
你一定听过什么是编码
比如,ascii,utf-8,gbk……。这些总的来说就是如何把一个字或者字母编码成计算机能认识的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 区别
string object是由characters组成的sequence,而unicode object是Unicode code units组成的sequence。
unicode就是 Unicode code units组成的序列,比如还是上面那句话:
u'\u4f60\u597d\uff0cpython'
而至于string这货,character是有多种编码方式的,比如单字节的ASCII,双字节的GB2312等等,再比如UTF-8。要想解读string,必需知道string里的character是用哪种编码方式,然后才能进行因为编码。
关于这些你要记住的只有一点:python所有编码都以unicode作为中转。 有了这句话,python编码就不是问题了。
我还是举上面那句话的例子:
print '你好,python'
时发生了什么?
- python将'你好,python'转换成了unicode即:
u'\u4f60\u597d\uff0cpython'
2.根据python的默认编码,把unicode转换成相应的编码,这里是unicode->ascii。因为ascii不支持中文,所以就报了错。
设定unicode转换成哪种编码的string
这很简单,想没有报错,只要从unicode中转时,转换成系统的默认编码就行了。
比如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吧。
当然,这个就是多数教程讲的,设定默认编码的注释: