设为首页 收藏本站
查看: 1198|回复: 0

[经验分享] python UnicodeEncodeError: 'ascii' codec can't encode characters 解决方法

[复制链接]

尚未签到

发表于 2017-5-4 07:16:48 | 显示全部楼层 |阅读模式
python UnicodeEncodeError: 'ascii' codec can't encode characters  详解
新建一个test.py
#coding:utf-8
s='nihao中国'.decode('utf-8')
print type(s)
print s

执行错误:
Traceback (most recent call last):
<type 'unicode'>
  File "/home/sdm/work/code/datadeal/tran_client/test_encode.py", line 5, in <module>
    print s
UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
-------------
修改如下
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
s='nihao中国'.decode('utf-8')
print type(s)
print s
---------一切正常-------
<type 'unicode'>
nihao中国
-------------------------
修改如下
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
s='nihao中国'.decode('utf-8')
print type(s)
fn='/tmp/test.txt'
f=open(fn,'w')
f.write(s)
f.close()
print open(fn).read()

--------------
不报错
<type 'unicode'>
nihao中国
---------------------------------------
修改如下
#coding:utf-8
import sys
reload(sys)
#sys.setdefaultencoding('utf-8')
s='nihao中国'.decode('utf-8')
print type(s)
fn='/tmp/test.txt'
f=open(fn,'w')
f.write(s)
f.close()
print open(fn).read()

---------
报错
<type 'unicode'>
Traceback (most recent call last):
  File "test_encode.py", line 11, in <module>
    f.write(s)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
-------------------------
说明 sys.setdefaultencoding
修改了默认的 unicode.encode 编码 行为
sys 为何reload 才有 sys.setdefaultencoding
-------
#coding:utf-8
import sys
#reload(sys)
sys.setdefaultencoding('utf-8')
-----------------
Traceback (most recent call last):
  File "test_encode.py", line 4, in <module>
    sys.setdefaultencoding('utf-8')
AttributeError: 'module' object has no attribute 'setdefaultencoding'
--------------------
grep -r -i 'setdefaultencoding' /usr/lib/python2.6
会看到
/usr/lib/python2.6/site.py:        sys.setdefaultencoding(encoding) # Needs Python Unicode build !
/usr/lib/python2.6/site.py:    # Remove sys.setdefaultencoding() so that users cannot change the
/usr/lib/python2.6/site.py:    if hasattr(sys, "setdefaultencoding"):
/usr/lib/python2.6/site.py:        del sys.setdefaultencoding
------------
site.py 里面
def main():
global ENABLE_USER_SITE
abs__file__()
known_paths = removeduppaths()
if ENABLE_USER_SITE is None:
ENABLE_USER_SITE = check_enableusersite()
known_paths = addusersitepackages(known_paths)
known_paths = addsitepackages(known_paths)
if sys.platform == 'os2emx':
setBEGINLIBPATH()
setquit()
setcopyright()
sethelper()
aliasmbcs()
setencoding()
execsitecustomize()
if ENABLE_USER_SITE:
execusercustomize()
# Remove sys.setdefaultencoding() so that users cannot change the
# encoding after initialization.  The test for presence is needed when
# this module is run as a script, because this code is executed twice.
if hasattr(sys, "setdefaultencoding"):
del sys.setdefaultencoding

main()
这个地方把del sys.setdefaultencoding 防止用户在改变defaultencoding  不知道为什么
----------------------------------------
site 这个模块是自动加载的
验证下
python  -c "import sys;print 'site' in sys.modules"
True
------------------
这个报错的
#coding:utf-8
import sys
s='nihao中国'.decode('utf-8')
print type(s)
fn='/tmp/test.txt'
f=open(fn,'w')
f.write(s)
f.close()
print open(fn).read()
-------
控制台直接运行 有时候不报错
#coding:utf-8
import sys
s='nihao中国'.decode('utf-8')
print type(s)
print s
但是 nohup 运行确报错:
nohup python test_encode.py
tail nohup.out
<type 'unicode'>
Traceback (most recent call last):
  File "test_encode.py", line 5, in <module>
    print s
UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
nohup 和 控制台运行 对python来说 标准输出是不一样的
-----------
在使用twisted.python.log 的时候和nohup 类似
代码前面加
import  twisted.python.log as  log
log.startLogging(sys.stdout)
之后 print unicode 仍然报错
#coding:utf-8
import sys
reload(sys)
#sys.setdefaultencoding('utf-8')
import  twisted.python.log as  log
log.startLogging(sys.stdout)
s='nihao中国'.decode('utf-8')
print type(s)
print s
2010-06-18 14:53:19+0800 [-] Log opened.
2010-06-18 14:53:19+0800 [-] <type 'unicode'>
2010-06-18 14:53:19+0800 [-] <unicode instance at 3074179752 with str error Traceback (most recent call last):
          File "/usr/lib/python2.6/dist-packages/twisted/python/reflect.py", line 560, in safe_str
            return str(o)
        UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
        >
----
结论:
开文件开头加上 就比较安全了
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
----------

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372683-1-1.html 上篇帖子: python CGI模块获取中文编码问题解决- 部分方案 下篇帖子: Python 3.3 教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表