重要:只有在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''突然与字符串一起打印。还有额外的代码。
有什么想法吗?有什么我想念的吗?
答案 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}}
但这不是我使用的方法。