Python 2.7.5.1 在 windows cmd 和 pycharm 上的编码和解码得到不同的结果

Encoding and decoding in Python 2.7.5.1 on windows cmd and pycharm get diffrent result

我用这段代码来处理中文:

  # -*- coding: utf-8 -*-

  strInFilNname = u'%s' % raw_input("input fileName:").decode('utf-8')

  pathName = u'%s' % raw_input("input filePath:").decode('utf-8')

当我在 PyCharm 上 运行 时一切正常。但是当我在 windows CMD 上 运行 这个时,我得到这个错误代码:

 Traceback (most recent call last):
 File "E:\Sites\GetAllFile.py", line 23, in <module>
 strInFilNname = u'%s' % raw_input("input filename:").decode('utf-8')
 File "E:\Portable Python 2.7.5.1\App\lib\encodings\utf_8.py", line 16, in decode
 return codecs.utf_8_decode(input, errors, True)
 UnicodeDecodeError: 'utf8' codec can't decode byte 0xd3 in position 0: invalid continuation byte

我已阅读此python document about Unicode HOWTO,但无法获得有效的解决方案。

我真的很想知道为什么会这样。

Windows 控制台编码不是 UTF-8。我假设您使用的是 Windows 的中文本地化版本,因为您提到错误在 Python 3.3 中消失并建议尝试 sys.stdin.encoding 而不是 utf-8.

下面是我的美国本地化 Windows 使用 cp437 代码页中的字符的示例,这是美国控制台使用的字符 (Python 2.7.9):

这个returns控制台编码中的一个字节串:

>>> raw_input('test? ')
test? │┤╡╢╖╕╣
'\xb3\xb4\xb5\xb6\xb7\xb8\xb9'

转换为 Unicode:

>>> import sys
>>> sys.stdin.encoding
'cp437'
>>> raw_input('test? ').decode(sys.stdin.encoding)
test? │┤╡╢╖╕╣║╗╝╜╛
u'\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b'

注意打印正确:

>>> print(raw_input('test? ').decode(sys.stdin.encoding))
test? │┤╡╢╖╕╣║╗
│┤╡╢╖╕╣║╗

这适用于中文 Windows 控制台,并且它将使用正确的中文控制台编码。这是将我的系统切换为使用中文后的相同代码:

>>> raw_input('Test? ')
Test? 我是美国人。
'\xce\xd2\xca\xc7\xc3\xc0\xb9\xfa\xc8\xcb\xa1\xa3'
>>> import sys
>>> sys.stdin.encoding
'cp936'
>>> raw_input('Test? ').decode(sys.stdin.encoding)
Test? 我是美国人。
u'\u6211\u662f\u7f8e\u56fd\u4eba\u3002'
>>> print raw_input('Test? ').decode(sys.stdin.encoding)
Test? 我是美国人。
我是美国人。

Python 3.3 使这变得更简单:

>>> input('Test? ')
Test? 我是美国人。
'我是美国人。'