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 中打印欢迎消息