Python通过'Git Bash'打印Unicode字符串得到'UnicodeEncodeError'

Posted

技术标签:

【中文标题】Python通过\'Git Bash\'打印Unicode字符串得到\'UnicodeEncodeError\'【英文标题】:Python print Unicode string via 'Git Bash' gets 'UnicodeEncodeError'Python通过'Git Bash'打印Unicode字符串得到'UnicodeEncodeError' 【发布时间】:2018-01-21 11:36:15 【问题描述】:

test.py 我有

print('Привет мир')

使用 cmd 正常工作

> python test.py
?????? ???

使用 Git Bash 出现错误

$ python test.py
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    print('\u041f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440')
  File "C:\Users\raksa\AppData\Local\Programs\Python\Python36\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: character maps to <undefined>

有人知道通过Git Bash执行python代码时出错的原因吗?

【问题讨论】:

这能回答你的问题吗? UnicodeEncodeError: 'charmap' codec can't encode characters 【参考方案1】:

Python 3.6 直接使用 Windows API 将 Unicode 写入控制台,因此打印非 ASCII 字符要好得多。但是 Git Bash 不是标准的 Windows 控制台,因此它会退回到以前的行为,在终端编码中编码 Unicode 字符串(在您的情况下为 cp1252)。 cp1252 不支持西里尔字母,所以它失败了。这个是正常的”。您会在 Python 3.5 及更早版本中看到相同的行为。

在 Windows 控制台中,Python 3.6 应该打印实际的西里尔字符,所以令人惊讶的是您的“?????? ???”。这不是“正常的”,但也许您没有选择支持西里尔文的字体。我安装了几个 Python 版本:

C:\>py -3.6 --version
Python 3.6.2

C:\>py -3.6 test.py
Привет мир

C:\>py -3.3 --version
Python 3.3.5

C:\>py -3.3 test.py
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    print('\u041f\u0440\u0438\u0432\u0435\u0442 \u043c\u0438\u0440 \u4f60\u597d')
  File "C:\Python33\lib\encodings\cp437.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: character maps to <undefined>

【讨论】:

那么有没有办法让 git bash 在这种情况下不返回错误(不管它是否打印字符)?【参考方案2】:

python 3.9 有这个问题

import sys, locale
print("encoding", sys.stdout.encoding)
print("local preferred", locale.getpreferredencoding())
print("fs encoding", sys.getfilesystemencoding())

如果返回“cp1252”而不是“utf-8”,则 print() 不适用于 unicode。

通过更改 Windows 系统区域设置已解决此问题。

Region settings > Additional settings > Administrative > Change system locale > Beta: Use Unicode UTF-8 for worldwide language support

【讨论】:

跟踪 Windows 系统区域设置对于运行由某些软件包预先制作的 Python 脚本很有帮助。如果无法在实际代码中调整语言环境,我建议调整系统语言环境。【参考方案3】:

从 Python 3.7 开始你可以这样做

import sys
sys.stdout.reconfigure(encoding='utf-8')

这主要为我解决了中文字符的 git bash 问题。它们仍然无法在控制台上正确打印到标准输出,但不会崩溃,并且在重定向到文件时会出现正确的 unicode 字符。

归功于sth in this answer。

【讨论】:

以上是关于Python通过'Git Bash'打印Unicode字符串得到'UnicodeEncodeError'的主要内容,如果未能解决你的问题,请参考以下文章

通过 Windows 终端中的脚本设置 git bash 配色方案

在 Windows 7 的 git bash 中打印欢迎消息

Python 3 不会从 Git Bash 命令行运行 [重复]

从 Windows 的 git bash 激活 venv

python unico - 独一无二

Git bash如何调用不同版本的python