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

时间:2017-08-13 13:22:31

标签: python-3.x unicode git-bash

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>

enter image description here

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

3 个答案:

答案 0 :(得分:1)

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

在Windows控制台中,Python 3.6应该打印实际的西里尔字符,所以令人惊讶的是你的&#34; ?????? ???&#34 ;.这不是&#34;正常&#34;,但也许您没有选择支持西里尔语的字体。我安装了几个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>

答案 1 :(得分:1)

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

答案 2 :(得分:0)

从 Python 3.7 开始你就可以了

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

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

归功于sth in this answer