python: Windows终端中的unicode, 使用的编码是什么?
我在Windows 7的终端里使用Python解释器。
我正在努力理解unicode和编码的概念。
我输入了:
>>> s='ë'
>>> s
'\x89'
>>> u=u'ë'
>>> u
u'\xeb'
问题 1: 为什么字符串 s
使用的编码和unicode字符串 u
使用的编码不一样呢?
我继续输入:
>>> us=unicode(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x89 in position 0: ordinal
not in range(128)
>>> us=unicode(s, 'latin-1')
>>> us
u'\x89'
问题 2: 我尝试用 latin-1
编码来把字符串转换成unicode字符串(其实,我一开始试了很多其他的编码,包括 utf-8
)。我怎么才能知道终端用什么编码来处理我的字符串呢?
问题 3: 我怎么才能让终端直接打印 嗯,我真傻。 ë
而不是 '\x89'
或 u'xeb'
呢?print(s)
就能解决这个问题。
我已经看过这个相关的SO问题,但没有找到线索: 在Windows上设置Python终端编码
8 个回答
如果其他人搜索时看到这个页面,最简单的方法是先在终端中设置代码页。
CHCP 65001
然后再运行你的程序。
对我来说,这样效果很好。对于 PowerShell,你可以用
powershell.exe -NoExit /c "chcp.com 65001"
来启动它。
别用Windows终端
我说Windows 7自带的“终端”,更准确地说是“DOS提示符”,简直是垃圾。这在Windows 95、NT、XP、Vista和7的时候就已经很糟糕了。也许他们在Powershell上修复了一些问题,我不太清楚。不过,这确实反映了当时微软在操作系统开发上遇到的一些麻烦。
输出到文件
你可以设置 PYTHONIOENCODING
这个环境变量,然后把输出重定向到一个文件里。
set PYTHONIOENCODING=utf-8
./myscript.py > output.txt
然后使用Notepad++,你就可以看到输出的UTF-8版本了。
安装win-unicode-console
win-unicode-console可以解决你的问题。你应该试试看。
pip install win-unicode-console
如果你对Python和命令行输出的问题感兴趣,可以查看Python问题1602。否则,直接使用win-unicode-console这个包就行了。
py -m run script.py
你可以在每个脚本中运行它,或者按照他们的说明,把 win_unicode_console.enable()
加到每次调用中,方法是把它添加到 usercustomize
或 sitecustomize
。
Unicode 其实不是一种编码方式。你需要把数据编码成字节串,然后再解码成 Unicode。
>>> '\x89'.decode('cp437')
u'\xeb'
>>> u'\xeb'.encode('cp437')
'\x89'
>>> u'\xeb'.encode('utf8')
'\xc3\xab'
Windows 终端使用的是老旧的代码页来支持 DOS。对于美国的 Windows 系统来说,使用的是:
>>> import sys
>>> sys.stdout.encoding
'cp437'
Windows 应用程序使用的是 Windows 代码页。Python 的 IDLE 会显示 Windows 的编码方式:
>>> import sys
>>> sys.stdout.encoding
'cp1252'
你的结果可能会有所不同。