工作中遇到如下问题
>>> str(u'我') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' in position 0: ordinal not in range(128)
解决方式如下
>>> str(u'我'.encode('utf-8')) '\xe6\x88\x91'
即把unicode转为utf-8编码。但是不是unicode字符都这样处理呢?看下面的
>>> str(u'abc') 'abc'
以上不处理一样可以的!
为什么会这样?http://docs.python.org/2/howto/unicode.html里有一段已经说的很明显了。
即:
内置函数 unicode() 提供了访问(编码和解码)所有已注册的 Unicode 编码的方法。它能转换众所周知的 Latin-1, ASCII, UTF-8, 和 UTF-16。后面的两个可变长编码字符集用一个或多个 byte 存储 Unicode 字符。默认的字符集是 ASCII,它只处理0到127的编码,拒绝其它的字符并返回一个错误。当一个 Unicode 字符串被打印、写入文件或通过 str() 转化时,它们被替换为默认的编码。
再看下面的例子
In [5]: a = u'你好' In [6]: a Out[6]: u'\u4f60\u597d' In [7]: b = '你好' In [8]: b Out[8]: '\xe4\xbd\xa0\xe5\xa5\xbd' In [9]: print a 你好 In [10]: print b 你好
从上面我看出几点疑问:
1 中文的常量,不论字符串,还是unicode它显示的这些到底是什么?其实这些就是常量在系统默认编码。那上面我的系统默认编码到底是GBK显示还是UTF-8显示呢?
因为我的是centos的所以只需要vi /etc/sysconfig/i18n 就知道了, 我的是utf-8的,
2 无论print a还是print b都正确显示了我所认识的汉字“你好”这又是怎么回事?这最好还是看一下源码,不过我能力有限,只能自行google了,基本上大致意思就是print打印会自动给对象编码,比如一个unicode对象,用print打印,它都会自行转化成当前编码,但是如果是write方式就不行,必须你自己手动去处理编码。这也就是上面提到的报错原因。
说了上面的,还有一个问题困挠我,decode()跟encode()方法。
即“decode是string2unicode,encode自然就是unicode2string。”
虽然就一句话的事,但我就是记不住。不知道各位是怎么理解的,然后能熟练运用的。反正我每次用的时候都是当场试验。都哪天我终于理解或者明白了,我再来把这个坑给补了吧~~
BTW:如果是windows系统,我下面的是xp的查找系统默认编码方式
然后打开控制面板-->语言与区域选项--->高级选项里查找代码页转换表
,936对应的是GBK编码。
即我的操作系统的默认编码是GBK
参考:
http://blog.csdn.net/feisan/article/details/1666876
http://blog.csdn.net/feisan/article/details/1667417
http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue5/unipain.html
http://blog.csdn.net/trochiluses/article/details/16825269