V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nowheretoseek
V2EX  ›  问与答

一个 Python 编码问题,求解

  •  
  •   nowheretoseek · 2018-09-11 11:38:14 +08:00 · 452 次点击
    这是一个创建于 2123 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我工作在 msys2 环境下,然后发现 mintty 和 conemu 两个终端环境下,python2 的输入、输出编码不一致,而 python3 是一致的。如下:

    |                     | python2 | python2 | python3 |
    |                     | mintty  | conemu  | both    |
    | sys.stdin.encoding  | None    | cp936   | cp936   |
    | sys.stdout.encoding | None    | cp936   | cp936   |
    

    这两个终端环境的 LANG、Locale 关键变量如下,似乎并无什么区别,也没发现两个软件提供的设置项里什么导致了这个情况:

    |          | mintty      | conemu                |
    | LANG     | zh_CN.UTF-8 | zh_CN.UTF-8@cjknarrow |
    | LC_ALL   | -           | -                     |
    | LC_CTYPE | -           | -                     |
    

    这导致的结果是,mintty 环境下,python2 程序的输入环境编码是 gbk,输出环境编码是 utf-8,比如运行这段代码:

    # coding: utf-8
    #! /bin/python
    
    import sys
    
    print type(sys.argv[1])
    print sys.argv[1].decode("utf-8")
    print sys.argv[1].decode("gbk").encode("utf-8")
    

    conemu 下的结果是:

    $ python test.py 你好
    <type 'str'>
    你好
    浣犲ソ
    

    mintty 下的结果是:

    $ python test.py 你好
    <type 'str'>
    ▒▒▒
    你好
    

    问题是,什么导致了这个差异,感觉 mintty 的 None 是不正常的,怎么改成跟 conemu 一样呢? 以及能否不在 python 脚本中更改 stdin 和 stdout 的 encoding,让它们默认都是 utf-8,就像 linux 那样呢?

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5499 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:02 · PVG 10:02 · LAX 19:02 · JFK 22:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.