我有一个控制台程序,输出颜色很棒。对于错误,以下代码与底部的一些简单示例一起使用。
# coding: utf-8
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from sys import stderr
from colored import fg
from colored import attr
from locale import getpreferredencoding
def format_error(x):
return '{0}{1}{2}'.format(fg(88), x, attr('reset'))
def print_error(x):
msg = format_error('✗ {0}\n'.format(x))
stderr.write(msg.encode(getpreferredencoding()))
print_error(str('ook'))
print_error(unicode(b'café', 'UTF-8'))
我无法控制x
。它可能是任何东西。此外,此脚本中的某些脚本是从GUI中调用的,该GUI通过glib-spawn-async捕获stdout
/ stderr
。因此,我不时会出现UnicodeDecodeError
错误。我看过Unicode HOWTo,但显然我错过了一些东西。
如何强化我的代码,以致UnicodeDecodeError
永远不会被提升?
例如,在gtk.textview
内,我得到以下内容,而在控制台上,一切都很好。已删除跟踪以删除不相关的数据。
File "/home/usr/nifty_logger.py", line 96, in print_success
sys.stdout.write(msg.encode(getpreferredencoding()))
File "/home/usr/.virtualenvs/rprs_bootstrap/lib64/python2.7/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)
答案 0 :(得分:1)
encode()采用定义错误处理的可选参数:
str.encode([encoding[, errors]])
来自文档:
返回字符串的编码版本。默认编码是当前的默认字符串编码。可以给出错误以设置不同的错误处理方案。错误的默认值是' strict',这意味着编码错误会引发UnicodeError。其他可能的值包括'忽略''替换',' xmlcharrefreplace',' backslashreplace'以及通过codecs.register_error()注册的任何其他名称,请参阅Codec Base Classes部分。有关可能的编码列表,请参阅标准编码部分。
在你的情况下:
msg.encode(getpreferredencoding(), 'backslashreplace')