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
zscself
V2EX  ›  Python

你们的 PyCharm 会出现 UnicodeEncodeError: 'ascii' codec can't encode characters 错误吗?

  •  
  •   zscself ·
    firedent · 2017-05-05 20:47:15 +08:00 · 5852 次点击
    这是一个创建于 2540 天前的主题,其中的信息可能已经有所发展或是发生改变。

    执行代码:

    49    print(sys.getdefaultencoding())
    50    print('歌单:'+data.get('cdlist')[0].get('dissname')+' 开始写入')
    51
    52    with open(data.get('cdlist')[0].get('dissname').replace('/','') + '_json.txt', 'w') as f:
    53        json.dump(data, f, indent=4)
    54    f.close()
    55
    56    with open(data.get('cdlist')[0].get('dissname').replace('/','')+'.txt', 'w') as f:
    57        for song in song_list:
    58            f.write(song['songname']+'\n')
    59    f.close()
    
    

    PyCharm 会提示("songname"是日文)

    utf-8
    歌单:百首日语神曲 涤荡心灵的歌声 开始写入
    Traceback (most recent call last):
      File "/Users/zscself/Dropbox/Source/PycharmProjects/QQ_music/main.py", line 58, in <module>
        f.write(song['songname']+'\n')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
    

    如果在 PyCharm 中的 Terminal 中运行 python ./main.py 会多出另外一个错误

    Error in usercustomize; set PYTHONVERBOSE for traceback:
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
    utf-8
    Traceback (most recent call last):
      File "main.py", line 50, in <module>
        print('\u6b4c\u5355\uff1a'+data.get('cdlist')[0].get('dissname')+' \u5f00\u59cb\u5199\u5165')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)
    

    由上面两个错误可以看出

    1. 直接“ Run ”会导致变量里的非 ASCII 字符无法通过 write()写入文件,但是变量里的非 ASCII 字符可以通过 print()显示
    2. 如果在间接的在 PyCharm 里的 Terminal 运行'python3 ./main.py'会导致变量里的非 ASCII 字符无法通过 print()显示

    真正诡异的是,这段代码可以正常运行在 zsh 里

    21 条回复    2018-04-04 09:54:25 +08:00
    konia
        1
    konia  
       2017-05-05 21:37:54 +08:00 via iPhone
    > 真正诡异的是,这段代码可以正常运行在 zsh 里。

    加个 u 呗
    zscself
        2
    zscself  
    OP
       2017-05-05 21:44:02 +08:00
    @konia print(u'中文') 也不好使
    Apeoud
        3
    Apeoud  
       2017-05-05 22:41:40 +08:00 via Android
    应该是内部 unicode 编码吧。试试 encode utf8
    Panmax
        4
    Panmax  
       2017-05-05 23:37:25 +08:00 via iPhone
    投奔 Python3 吧
    EricCartman
        5
    EricCartman  
       2017-05-05 23:56:53 +08:00
    天灭 Python2
    whwq2012
        6
    whwq2012  
       2017-05-06 09:33:56 +08:00
    用三引号括住这些字符试试
    freestyle
        7
    freestyle  
       2017-05-06 11:58:09 +08:00
    pycharm 右下角 修改文件编码方式为 utf-8
    uucloud
        8
    uucloud  
       2017-05-06 12:04:29 +08:00
    # -*- coding:utf-8 -*-
    zscself
        9
    zscself  
    OP
       2017-05-06 15:34:27 +08:00
    @Panmax @EricCartman 本来就是 3.6
    @freestyle 'Global Encoding'、'Project Encoding'、'Default Encoding for properties files'这三项全部设置成 UTF-8
    @uucloud '# -*- coding:utf-8 -*-'和'# coding= utf-8'都试过了,还是不行。
    @whwq2012 没用
    write()函数那个还好解决,调用 open()的时候加上参数 encoding="utf-8"就没问题了,其实不加参数在系统 shell 里也是可以运行的,但是没办法在 PyCharm 里运行。
    至于在 PyCharm 里的 Terminal 无法运行,我认为是 PyCharm 的 Terminal 模块和系统“衔接”的时候出了问题,因为在 Intellij 的 Terminal 里也出现了同样的错误
    wwqgtxx
        10
    wwqgtxx  
       2017-05-06 18:37:07 +08:00
    去检查一下 console 的 encoding 设置
    esile
        11
    esile  
       2017-05-06 22:24:52 +08:00 via iPhone
    玩🐍必修课
    zscself
        12
    zscself  
    OP
       2017-05-07 09:24:25 +08:00
    @wwqgtxx 能说下具体位置吗?反正我已经把配置里面所有带“ encoding ”的选项都设置了一遍。。。
    wwqgtxx
        13
    wwqgtxx  
       2017-05-07 10:49:50 +08:00 via iPhone
    @zscself search 一下 console 设置呗
    svcvit
        14
    svcvit  
       2017-05-20 20:49:05 +08:00
    遇到和你一摸一样的问题,就是在 pycharm 不行,zsh 可以,你最后解决了么?
    svcvit
        15
    svcvit  
       2017-05-21 08:45:28 +08:00
    最后解决方法是新建文件的时候加 encoding='utf8'就可以了。
    with open('%s.html' % item, 'w', encoding='utf8') as f:
    zscself
        16
    zscself  
    OP
       2017-05-21 08:56:58 +08:00
    @svcvit 你看九楼我的回复,这个 open()函数的编码问题我已经解决了。但是,现在,print()函数依然不能输出中文。
    zscself
        17
    zscself  
    OP
       2017-05-21 09:03:39 +08:00
    @svcvit
    第一:
    同样是
    with open('fileName.txt', 'w', encoding="utf-8") as f:
    for song in song_list:
    f.write(song['songname']+'\n')
    f.close()
    这段代码,如果我使用系统自带的终端,即便没有 encoding="utf-8"参数,依然可以运行。上述代码如果在 PyCharm 里的终端运行,必须加上 encoding="utf-8"。关于这点,我挺不解的。
    第二:
    print("中文字符")
    上述代码,通过系统自带终端和 PyCharm 的“ Run ”都正常运行。但是!但是!唯独没法再 PyCharm 里的终端运行,错误信息,在一开始我就贴出来了。
    不知道你和我遇到的是不是同一个问题?
    pennz
        18
    pennz  
       2017-09-17 14:38:11 +08:00
    @zscself 不仅仅是在 PyCharm,我在 Atom 编辑器也遇到了这样的问题,用编辑器的 runner 插件,就是会报你那样的错误,但是在终端 bash 或者 zsh 就是正常的,捣鼓了半天,还是找不到解决办法,请问你解决了吗?请赐教~
    zscself
        19
    zscself  
    OP
       2017-09-17 15:04:46 +08:00
    @pennz 并没有。。。
    pennz
        20
    pennz  
       2017-09-17 15:32:32 +08:00
    @zscself 郁闷。搞得现在每次要运行,都得用终端来跑。~~Google、stackoverflow 上面也找不到。明明我这里也是使用 Python3.6 了。不应该存在编码问题的。~
    Orice
        21
    Orice  
       2018-04-04 09:54:25 +08:00
    我也出现了这种情况,是在读文件的时候,报错
    然后,我在生成文件的部分,和读文件的部分,都声明了编码为 utf-8
    问题就解决了
    感谢 15 楼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4529 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:05 · PVG 18:05 · LAX 03:05 · JFK 06:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.