我简化了代码以便更好地理解。
这是问题所在:
case 1:
# -*- coding: utf-8 -*-
text = "چرا کار نمیکنی؟" # also using u"...." results the same
print(text)
output:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
case 2:
text = "چرا کار نمیکنی؟".encode("utf-8")
print(text)
没有输出。
case 3:
import sys
text = "چرا کار نمیکنی؟".encode("utf-8")
sys.stdout.buffer.write(text)
output:
چرا کار نمیکنی؟
我知道情况 3 可以某种方式工作,但我想使用其他函数,如 print() 、 write(str()) 等。
我还阅读了有关 Unicode 的 python 3 文档here.
还阅读了 stackoverflow 中的数十个问答。
and here是一篇很长的文章,解释了 python 2.X 的问题和答案
简单的问题是:
如何使用 python print() 函数打印波斯语或阿拉伯语等非 ASCII 字符?
更新1:
正如许多人建议的那样,问题与我测试过的终端有关:
case 4 :
text = "چرا کار نمیکنی؟" .encode("utf-8")# also using u"...." results the same
print(text)
终端 :
python persian_encoding.py > test.txt
测试.txt:
b'\xda\x86\xd8\xb1\xd8\xa7 \xda\xa9\xd8\xa7\xd8\xb1 \xd9\x86\xd9\x85\xdb\x8c\xda\xa9\xd9\x86\xdb\x8c\xd8\x9f'
非常重要的更新:
经过一段时间的研究这个问题,最后我找到了另一种解决方法来让 cmd.exe 完成这项工作(不需要 ConEmu 等第三方软件或......):
首先稍微解释一下:
我们的主要问题与Python无关。这是 Windows 中命令提示符字符集的问题(有关完整说明,请查看 Arman 的答案)
所以...如果您将 Windows 命令提示符的字符集更改为 UTF-8 而不是默认的 ascii ,那么命令提示符将能够与 UTF-8 字符(如波斯语或阿拉伯语)交互,此解决方案不能保证良好的表示字符(因为它们会像小方块一样打印出来),但如果你想在 python 中使用 UTF-8 字符进行文件 I/O,这是一个很好的解决方案。
Steps:
在从命令行启动 python 之前,输入:
chcp 65001
现在像往常一样运行你的 python 代码。
python testcode.py
情况1的结果:
?????? ??? ??????
它运行没有错误。
截屏:
![enter image description here](https://i.stack.imgur.com/hJvto.png)
有关如何将 65001 设置为默认字符集的更多信息,请检查this out.