使用Python启动预激活的控制台窗口,并设置chcp 65001。

5
我使用了一个Python库,在Windows控制台中打印Unicode字符。如果我调用打印Unicode字符的库函数,就会抛出异常'charmap' codec can't encode characters
因此,我尝试解决这个错误的方法如下: 在调用库函数之前,使用os.system("chcp 65001")从Python中调用"chcp 65001" Windows控制台命令。
我知道有类似的问题,所以我尝试了上面的解决方法。它成功地在控制台中调用了该命令,并告诉我它激活了代码页。
然而,异常再次出现了。
如果我在不关闭先前的控制台的情况下再次运行程序,则程序将成功执行且没有任何异常。这意味着以上控制台命令在第一次尝试后生效。
我的问题是:是否有一种方式可以在启动Windows控制台时预先激活Unicode支持,以便我不必调用两次程序。

你不能使用 chcp 来解决这个问题,可以使用这里列出的解决方案:Python、Unicode 和 Windows 控制台 - roeland
2个回答

7

在启动cmd窗口的快捷方式中添加/k chcp 65001。或者使用Python 3.6,它使用Windows Unicode API向控制台输出并忽略代码页。但是,你仍然需要支持你要打印的字体。


1
另一种选择是使用win_unicode_console模块,而不是使用代码页65001 - 至少在微软修复控制台(conhost.exe)以正确处理UTF-8之前不要使用。即使在Windows 10中,只有ASCII(0-127)可以从控制台读取,当使用代码页65001时,在Windows 7中(在8+中已修复),所有依赖于WriteFile返回写入的字节数而不是写入的解码UTF-16代码数(在BMP中,1-3个UTF-8字节映射到1个UTF-16代码)的程序最终会进行多次写入,这样每次具有非ASCII字符的写入后都会留下一串垃圾流。 - Eryk Sun
2
Windows用户中的一个常见误解是将控制台称为“cmd窗口”。cmd shell 与控制台窗口本质上没有任何关系。它可以在没有控制台的情况下运行。如果它连接到控制台,则只是一个常规客户端进程,与python.exe、powershell.exe、doskey.exe、chcp.com或mode.com没有任何区别(“.COM”是一个遗留扩展名;它们是64位PE二进制文件)。 - Eryk Sun
1
@Mark 像你建议的那样,我使用了Python 3.6,它运行得非常好。谢谢。 - ash
你仍然需要字体支持来打印你所需的内容。我该如何确定使用哪种字体?我的一些表情符号打印出来是方框替换字符。 - JDOaktown

1
下面的设置适用于Windows 8.1:

==> set "PYTHONIOENCODING=UTF-8"

==> chcp 65001
Active code page: 65001

==> type "%APPDATA%\Python\Python35\site-packages\usercustomize.py"
import win_unicode_console
win_unicode_console.enable()

测试:

==> python
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> print (u'ěščřžýáíé ;ςερτυ яшертю ğüşi')
ěščřžýáíé ;ςερτυ яшертю ğüşi
>>>

测试中的字符串(无意义,仅供演示):

  • ěščřžýáíé 拉丁文,中欧语系
  • ;ςερτυ    希腊文
  • яшертю    西里尔文
  • ğüşi      拉丁文,土耳其语

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接