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

Rab*_*ski 7 python windows unicode terminal

我在Windows 7终端中使用Python解释器.
我试图围绕unicode和编码.

我键入:

>>> s='ë'
>>> s
'\x89'
>>> u=u'ë'
>>> u
u'\xeb'
Run Code Online (Sandbox Code Playgroud)

问题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'
Run Code Online (Sandbox Code Playgroud)

问题2:我尝试使用latin-1编码运气好把字符串变成unicode字符串(实际上,我首先尝试了一堆其他字符串,包括utf-8).如何找出终端用于编码字符串的编码?

问题3:如何才能让终端打印ëë,而不是'\x89'u'xeb'嗯,愚蠢的我.print(s)做的工作.

我已经看过这个相关的SO问题,但没有任何线索:在Windows上设置Python终端编码

Mar*_*nen 12

Unicode不是编码.您编码为字节字符串并解码为Unicode:

>>> '\x89'.decode('cp437')
u'\xeb'
>>> u'\xeb'.encode('cp437')
'\x89'
>>> u'\xeb'.encode('utf8')
'\xc3\xab'
Run Code Online (Sandbox Code Playgroud)

Windows终端使用DOS的遗留代码页.对于美国Windows,它是:

>>> import sys
>>> sys.stdout.encoding
'cp437'
Run Code Online (Sandbox Code Playgroud)

Windows应用程序使用Windows代码页.Python的IDLE将显示windows编码:

>>> import sys
>>> sys.stdout.encoding
'cp1252'
Run Code Online (Sandbox Code Playgroud)

您的结果可能会有所不


Cam*_*mer 5

避免使用 Windows 终端

我并不是说“终端”更合适,Windows 7 附带的“DOS 提示符”绝对是垃圾。它在 Windows 95、NT、XP、Vista 和 7 中很糟糕。也许他们用 Powershell 修复了它,我不知道。然而,它表明了当时困扰微软操作系统开发的问题。

改为输出到文件

设置PYTHONIOENCODING环境变量,然后将输出重定向到文件。

set PYTHONIOENCODING=utf-8

./myscript.py > output.txt
Run Code Online (Sandbox Code Playgroud)

然后使用Notepad++,您可以看到输出的 UTF-8 版本。

安装 win-unicode-console

win-unicode-console可以解决您的问题。你应该试试

pip install win-unicode-console
Run Code Online (Sandbox Code Playgroud)

如果您对 Python 和命令行输出问题的深入讨论感兴趣,请查看Python 问题 1602。否则,只需使用 win-unicode-console 包。

py -m run script.py
Run Code Online (Sandbox Code Playgroud)

按脚本运行它,或者您可以按照他们的指示win_unicode_console.enable()通过将其添加到usercustomize或来添加到每个调用中sitecustomize

  • 从 Python 3.6 开始,Windows 控制台更加有用。输出到控制台完全绕过了代码页的废话,直接使用 Unicode。 (3认同)