【问题标题】:Set Python terminal encoding on Windows在 Windows 上设置 Python 终端编码
【发布时间】:2011-05-30 18:30:44
【问题描述】:

我碰巧未能在 Windows 上的 Python 终端中设置字符编码。根据官方指南,这是小菜一碟:

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

好的,现在开始测试:

print 'Русский'

制作一块 mojibake。做错了什么?

P.S. IDE 是 Visual Studio 2010,如果重要的话

【问题讨论】:

  • 你可以试试吗?打印你'Русский' ?
  • u'Русский' 产生 SyntaxError: can't decode byte 0xd0 in position...
  • 祝你好运,说服 Windows 上的 Python 将除 ascii 之外的任何内容输出到交互式控制台
  • u'Русский' 工作,如果编码设置为 'windows-1251'。你的上帝现在在哪? :)
  • 您可能想查看我的that 答案。

标签: python windows character-encoding


【解决方案1】:

你应该使用 unicode:

print u'Русский'

或切换到python3(默认为unicode)。

【讨论】:

  • from __future__ import unicode_literals 在 Python 2 上也启用了 Unicode 文字。如果控制台 chcp 不能表示给定的 Unicode 字符或输出被重定向(在这种情况下 Python 2 使用 ascii),则默认情况下打印 Unicode 将不起作用。见possible solutions
【解决方案2】:

更新:请参阅J.F. Sebastian's answer 以获得更好的解释和更好的解决方案。

# -*- coding: utf-8 -*- 设置源文件的编码,而不是输出编码。

您必须在打印之前使用与终端使用的完全相同的编码对字符串进行编码。在您的情况下,我猜您的代码页是西里尔文(cp866)。因此,

print 'Русский'.encode("cp866")

【讨论】:

  • 代码失败并显示 "UnicodeDecodeError: 'ascii' codec can't decode byte" -- 您忘记了 u'' 前缀来创建 Unicode 字符串。您不应在脚本中对环境的字符编码进行硬编码。环境可能会改变。 Print Unicode instead
  • 嗯。我刚刚测试了它,结果证明你是对的。我写这个答案已经有一段时间了,所以也许有些事情发生了变化?无论如何,我会通过将答案重定向到您的来更新答案。
【解决方案3】:

它会产生 mojibake,因为'' 是 Python 2 中的字节字符串文字(除非使用了 from __future__ import unicode_literals)。您正在将 utf-8 字节(源代码编码)打印到使用某些 other 字符编码的 Windows 控制台(如果您看到 mojibake,编码会有所不同):

>>> print(u'Русский'.encode('utf-8').decode('cp866'))
╨а╤Г╤Б╤Б╨║╨╕╨╣

解决方案是打印Unicode而不是as @JBernardo suggested:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
print(u'Русский')

如果控制台编码支持西里尔字母,例如cp866,它就可以工作。

如果要将输出重定向到文件;您可以使用PYTHONIOENCODING 环境变量来设置Python 用于I/O 的字符编码:

Z:\> set PYTHONIOENCODING=utf-8
Z:\> python your_script.py > output.utf-8.txt

如果你想print Unicode characters that can't be represented using the console encoding (OEM code page) 那么你可以安装win-unicode-console Python package:

Z:\> py -m pip install win_unicode_console
Z:\> py -m run your_script.py

【讨论】:

    【解决方案4】:

    以防其他人在搜索时获得此页面 最简单的是设置windows终端代码页

    CHCP 65001
    

    或者对于电源外壳启动它

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

    来自Is there a Windows command shell that will display Unicode characters?

    【讨论】:

    猜你喜欢
    • 2012-02-27
    • 2011-11-15
    • 2020-11-15
    • 2022-10-17
    • 1970-01-01
    • 2017-05-17
    • 2017-07-19
    • 2017-12-20
    • 2020-11-22
    相关资源
    最近更新 更多