python3中波斯语或阿拉伯语的unicode和编码

python3中波斯语或阿拉伯语的unicode和编码,python,python-3.x,unicode,Python,Python 3.x,Unicode,一些代码块如下所示: city_name = obj['city_from']['name'].encode('utf-8') print(city_name) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128) 此代码的输出为: b'\xd8\xa8\xd9\x86\xd8\xaf\xd8\xb1\xd8\xb9\xd

一些代码块如下所示:

city_name = obj['city_from']['name'].encode('utf-8')
            print(city_name)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
此代码的输出为:

b'\xd8\xa8\xd9\x86\xd8\xaf\xd8\xb1\xd8\xb9\xd8\xa8\xd8\xa7\xd8\xb3'
如果我删除encode('utf-8')输出,则会发生如下变化:

city_name = obj['city_from']['name'].encode('utf-8')
            print(city_name)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)
这个输出语言是波斯语(像阿拉伯语),我想知道为什么python3中的string类没有任何解码方法? 你有解决这个问题的办法吗


谢谢

好的,我找到了我的解决方案,它工作起来很有魅力

import sys
sys.stdout.buffer.write(TestText2)
更新: 这个问题对于ZSH脚本环境来说,我使用bash,一切都可以找到。

在打印Unicode字符串之前,不需要将其转换为字节。Python为您完成了这项工作

更改Python用于I/O的字符编码;设置
pythonionecoding=utf-8
环境变量或更改您的区域设置

在您的例子中,它看起来像是
sys.stdout.encoding
ascii

$ python3 -c'import sys; print(sys.stdout.encoding)' 
UTF-8
$ python3 -c'import sys; print(sys.stdout.encoding)' | cat
ascii
$ LC_CTYPE=C python3 -c'import sys; print(sys.stdout.encoding)' 
ANSI_X3.4-1968
ANSI_X3.4-1968
ascii
的标准名称

$ PYTHONIOENCODING=uTf-8 python3 -c'import sys; print(sys.stdout.encoding)' | cat
uTf-8
$ LC_CTYPE=C.UTF-8 python3 -c'import sys; print(sys.stdout.encoding)' 
UTF-8

不要在脚本中硬编码字符编码。打印Unicode字符串并适当地配置您的环境

您的终端需要ASCII,因此Python符合要求。尝试将您的终端使用的字符集更改为UTF-8。既然您已经证明您的终端/控制台能够显示UTF-8,请参阅此答案,以便能够使用
print
而无需编码:@MarkRansom:字节如何解释为文本由用户环境定义。打印表示文本“原样”的字节以及对脚本中的字符编码进行硬编码对于用户环境来说太复杂了。噢:|我的ZSH这是个问题,当我使用ZSH编码是asciid时,你有
C.UTF-8
locale(运行
locale-a
)吗?尝试
LC\u ALL=en\u US.utf8 python3…
覆盖其他区域设置(优先级:
LC\u ALL
LC\u CTYPE
LANG
)。注意:如何永久更改区域设置取决于系统,例如,在我的系统上有
/etc/default/locale
文件:
LANG=“en_US.UTF-8”