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? 我是美国人。
'我是美国人。'
我用这段代码来处理中文:
# -*- 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? 我是美国人。
'我是美国人。'