python: Windows终端中的unicode, 使用的编码是什么?

10 投票
8 回答
33450 浏览
提问于 2025-04-16 19:32

我在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 个回答

2

如果其他人搜索时看到这个页面,最简单的方法是先在终端中设置代码页。

CHCP 65001

然后再运行你的程序。

对我来说,这样效果很好。对于 PowerShell,你可以用

powershell.exe -NoExit /c "chcp.com 65001"

来启动它。

这段内容来自于 python: unicode in Windows terminal, encoding used?

6

别用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() 加到每次调用中,方法是把它添加到 usercustomizesitecustomize

13

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'

你的结果可能会有所不同。

撰写回答