我工作在 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")
$ python test.py 你好
<type 'str'>
你好
浣犲ソ
$ python test.py 你好
<type 'str'>
▒▒▒
你好
问题是,什么导致了这个差异,感觉 mintty 的 None 是不正常的,怎么改成跟 conemu 一样呢? 以及能否不在 python 脚本中更改 stdin 和 stdout 的 encoding,让它们默认都是 utf-8,就像 linux 那样呢?