一个 Python 编码问题,求解

2018-09-11 11:38:14 +08:00
 nowheretoseek

我工作在 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 那样呢?

452 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/488142

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX