您的位置:首页 > 其它

UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' in position 0: ordinal not in range(128)

2014-03-13 15:58 537 查看
工作中遇到如下问题

>>> 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐