Raspbian无法打印()utf-8多字节字符?

时间:2015-02-05 09:23:39

标签: python python-3.x utf-8 raspbian

重要:只有在Rasberry pi(没有ssh)的控制台上运行python3时才会发生这种情况,使用Raspbian

以下是造成问题的代码:

string = "silence on joue ! €"
byte_string = string.encode( 'ascii', 'ignore' )
print ( byte_string )
print ( string )

控制台输出

b'silence on joue ! €'
UnicodeEncodeError 'ascii' codec can't encode character '\u20ac' in position 18 ordinal not in range(128)

所以看起来print()会对编码进行隐式调用,但是任何错误都会引发异常。

此代码在Windows上运行正常。不酷。

现在我的解决方案是在每次打印之前拨打电话(' ascii''忽略')。但这很糟糕,因为我有b''突然与字符串一起打印。还有额外的代码。

有什么想法吗?有什么我想念的吗?

1 个答案:

答案 0 :(得分:1)

您的控制台配置告诉Python它被配置为仅处理ASCII。

您需要调整该配置; Python查看LC_CTYPE环境变量,它是LC_ALL变量的子集,而LANG变量又来自locale 。您可以通过运行以下来查看配置:

sudo dpkg-reconfigure locales

在终端。你可以运行:

LANG

重新配置可用的区域设置,或在profile文件中设置${LANG:=<locale>.<encoding>}; export LANG环境变量。另请参阅Debian Locale wiki page,尤其是标准部分,了解这意味着什么。对于控制台,我使用LANG=en_US.UTF8 python 方法,因为它会为控制台设置合理的默认设置,但允许SSH连接指定不同的区域设置。

您可以先使用以下方法试用个别设置:

print(string.encode('ascii', 'replace').decode('ascii'))
例如

;这会选择UTF-8编码的美国英语语言环境。

如果 要编码为ASCII,您可以再次解码以生成ASCII保存的Unicode字符串对象:

{{1}}

但这不是我使用的方法。