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

时间:2021-12-17 23:44:59

  工作中遇到如下问题

>>> 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的查找系统默认编码方式

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

然后打开控制面板-->语言与区域选项--->高级选项里查找代码页转换表

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

,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