【问题标题】:Launch console window pre-activated with chcp 65001 using python使用 python 启动使用 chcp 65001 预激活的控制台窗口
【发布时间】:2023-03-17 14:15:01
【问题描述】:

我使用 python 库将 Unicode 字符打印到 Windows 控制台。如果我在库上调用一个打印出 Unicode 字符的函数,它将抛出异常 'charmap' codec can't encode characters

这就是我试图解决该错误的方法: 在调用库函数之前,使用 os.system("chcp 65001") 从 python 调用“chcp 65001”Windows 控制台命令。

我知道有类似的问题,这就是我尝试上述解决方案的原因。它成功调用控制台上的命令并告诉我它激活了代码页。

但是,异常再次出现。如果我尝试在不关闭前一个控制台的情况下再次运行程序,则程序将成功执行,没有任何异常。这意味着上面的控制台命令在第一次尝试后生效。

我的问题是:有没有办法通过预先激活 Unicode 支持来启动 Windows 控制台,这样我就不必调用该程序两次。

【问题讨论】:

标签: python windows python-3.x unicode console


【解决方案1】:

/k chcp 65001 添加到启动cmd 窗口的快捷方式中。或者,使用 Python 3.6,它使用 Windows Unicode API 写入控制台并忽略代码页。但是,您仍然需要为您打印的内容提供字体支持。

【讨论】:

  • 另一种方法是使用win_unicode_console 模块,而不是使用代码页 65001——至少在 Microsoft 修复控制台 (conhost.exe) 以使其与 UTF-8 一起正常工作之前不会。即使在 Windows 10 中,使用代码页 65001 时也只能从控制台读取 ASCII (0-127),而在 Windows 7(固定为 8+)中,所有依赖 WriteFile 的程序都返回写入的字节数,而不是写入的解码的 UTF-16 代码的数量(在 BMP 中,1-3 个 UTF-8 字节映射到 1 个 UTF-16 代码),最终进行了多次写入,这在每次写入后都会留下非 ASCII 的垃圾流字符。
  • Windows 用户的一个常见误解是将控制台称为“cmd 窗口”。 cmd shell 本质上与控制台窗口无关。它可以在没有控制台的情况下独立运行。如果它附加到控制台,那么它只是一个常规的客户端进程,与 python.exe、powershell.exe、doskey.exe、chcp.com 或 mode.com 没有什么不同(“.COM”是一个遗留扩展名;它们'是 64 位 PE 二进制文件)。
  • @Mark 就像你建议的那样,我使用了 Python 3.6,它就像一个魅力。谢谢
  • >"您的打印内容仍然需要字体支持" 如何确定使用哪种字体?我的一些表情符号打印为框替换字符。
【解决方案2】:

下一个设置适用于 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     拉丁语、土耳其语

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    相关资源
    最近更新 更多