UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' in position 0: ordinal not in range(128)
2014-03-13 15:58
537 查看
工作中遇到如下问题
解决方式如下
即把unicode转为utf-8编码。但是不是unicode字符都这样处理呢?看下面的
以上不处理一样可以的!
为什么会这样?http://docs.python.org/2/howto/unicode.html里有一段已经说的很明显了。
即:
再看下面的例子
从上面我看出几点疑问:
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
>>> 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
相关文章推荐
- 【Python】解决UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 0: ordinal not in range(128)
- UnicodeEncodeError: 'ascii' codec can't encode character u'\u5929' in position 2: ordinal not in range(128)
- UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 7: ordinal not in range(128) [duplicate]
- Windows下pip安装及更新出现“UnicodeEncodeError: 'ascii' codec can't encode character u'\u258c' in position 8: ordinal not in range(128)”问题解决办法
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
- 安装mysql-python报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 65: ordinal not in range(128)
- Python UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
- (转载)UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128)解决方法
- python UnicodeDecodeError: 'ascii' codec can't decode byte 0xa6 in position 907: ordinal not in range(128)
- UnicodeEncodeError: 'ascii' codec can't encode character u'\u65e0' in position 1: ordinal not in range(128)
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
- Mac sublime 编译Python UnicodeEncodeError: 'ascii' codec can't encode characters in position 6-8: ordinal not in range(128)
- python UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 2: ordinal not in range(128)错误解决办法
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 14-15: ordinal not in range(128)
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xa3 in position 1: ordinal not in range(128)
- python2.7 报错(UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128))
- UnicodeEncodeError: 'ascii' codec can't encode characters in position 16-22: ordinal not in range(128)
- python处理字符串时出现的错误'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决方法