Raspbian 不能 print() utf-8 多字节字符?
Raspbian can't print() utf-8 multibyte characters?
重要提示: 只有当您使用 Raspbian 在 raspberry pi(无 ssh)的控制台上运行 python3 时才会发生这种情况
所以这是导致麻烦的代码:
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 上运行良好。不酷。
现在我的解决方案是在每次打印之前调用 encode( 'ascii', 'ignore' )。但这很糟糕,因为我有 b'' 突然与字符串一起打印出来。还有额外的代码。
有什么想法吗?有什么我想念的吗?
您的控制台配置告诉 Python 它配置为仅处理 ASCII。
您需要调整该配置; Python 查看 LC_CTYPE
环境变量,它是 LC_ALL
变量的子集,后者又派生自 LANG
。你可以通过 运行ning:
查看你的配置
locale
在终端中。你可以 运行:
sudo dpkg-reconfigure locales
重新配置可用的语言环境,或在 profile
文件中设置 LANG
环境变量。另请参阅 Debian Locale wiki page,尤其是 Standard 部分,了解这意味着什么。对于控制台,我会使用 ${LANG:=<locale>.<encoding>}; export LANG
方法,因为这将为控制台设置一个合理的默认值,但允许 SSH 连接指定不同的语言环境。
您可以先尝试个别设置,方法是:
LANG=en_US.UTF8 python
例如;这会选择使用 UTF-8 编码的美国英语语言环境。
如果您有编码为 ASCII,您总是可以再次解码以生成一个 ASCII 保存的 Unicode 字符串对象:
print(string.encode('ascii', 'replace').decode('ascii'))
但这不是我会使用的方法。
重要提示: 只有当您使用 Raspbian 在 raspberry pi(无 ssh)的控制台上运行 python3 时才会发生这种情况
所以这是导致麻烦的代码:
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 上运行良好。不酷。
现在我的解决方案是在每次打印之前调用 encode( 'ascii', 'ignore' )。但这很糟糕,因为我有 b'' 突然与字符串一起打印出来。还有额外的代码。
有什么想法吗?有什么我想念的吗?
您的控制台配置告诉 Python 它配置为仅处理 ASCII。
您需要调整该配置; Python 查看 LC_CTYPE
环境变量,它是 LC_ALL
变量的子集,后者又派生自 LANG
。你可以通过 运行ning:
locale
在终端中。你可以 运行:
sudo dpkg-reconfigure locales
重新配置可用的语言环境,或在 profile
文件中设置 LANG
环境变量。另请参阅 Debian Locale wiki page,尤其是 Standard 部分,了解这意味着什么。对于控制台,我会使用 ${LANG:=<locale>.<encoding>}; export LANG
方法,因为这将为控制台设置一个合理的默认值,但允许 SSH 连接指定不同的语言环境。
您可以先尝试个别设置,方法是:
LANG=en_US.UTF8 python
例如;这会选择使用 UTF-8 编码的美国英语语言环境。
如果您有编码为 ASCII,您总是可以再次解码以生成一个 ASCII 保存的 Unicode 字符串对象:
print(string.encode('ascii', 'replace').decode('ascii'))
但这不是我会使用的方法。