V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
goalong
V2EX  ›  Python

求助:遇到奇怪的 python2 编码问题

  •  
  •   goalong ·
    goalong · 2017-03-08 18:44:31 +08:00 · 1781 次点击
    这是一个创建于 2822 天前的主题,其中的信息可能已经有所发展或是发生改变。

    基本的代码是这样:

    import codecs

    filename = u"测试.doc"

    with codecs.open(filename, 'w', 'utf-8') as f:

    f.write("lalala")
    

    就是这样简单的写入一个文件,在本地的 Mac 上是 OK 的,在 ubuntu 服务器上 python 解释器的交互环境里执行也没问题,但是写成一个 Tornado 的 handler 就报 UnicodeEncodeError 了,很奇怪,文件头部是写有# --coding:utf8 --编码声明的,也试过 reload(sys), sys.setdefaultencoding('utf-8')这样的修改系统文件编码,还是报原来的错,求各位指点。

    4 条回复    2017-03-11 19:08:08 +08:00
    nicevar
        1
    nicevar  
       2017-03-08 22:37:29 +08:00
    你用 print sys.getdefaultencoding()获取一下当前的编码方式,我怀疑你代码写得有问题,不是 utf8 编码
    lzjun
        2
    lzjun  
       2017-03-09 09:30:42 +08:00
    你是说在 f.write 的时候报错吗?
    goalong
        3
    goalong  
    OP
       2017-03-09 10:08:42 +08:00
    @nicevar @lzjun 谢谢你们的回复, sys.getdefaultencoding()得到的是 ascii ,可是我之后加上 reload(sys), sys.setdefaultencoding('utf-8'),仍然用 sys.getdefaultencoding()得到编码是 utf-8 了,后面再进行文件的写入,还是报错,错误是在 with 那一行。另外,把 filename 改成"测试.doc"即 str 类型的, 就能成功执行了,估计还是跟运行环境有关,可是在同样的环境下,在 python 解释器里一行一行执行,也是成功的,真是费解
    zsz
        4
    zsz  
       2017-03-11 19:08:08 +08:00 via iPhone
    你虽然在 tornado 中把编码修改了,但是对于字面量 u"测试.doc" 已经强制用 unicode 了,你需要转换成 utf8 ,或者改成字符串类型
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3383 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 11:37 · PVG 19:37 · LAX 03:37 · JFK 06:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.