UTF-8和彩色印刷问题......

时间:2016-09-14 07:36:37

标签: python python-2.7 utf-8

我有一个控制台程序,输出颜色很棒。对于错误,以下代码与底部的一些简单示例一起使用。

# 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)

1 个答案:

答案 0 :(得分:1)

encode()采用定义错误处理的可选参数:

str.encode([encoding[, errors]])

来自文档:

  

返回字符串的编码版本。默认编码是当前的默认字符串编码。可以给出错误以设置不同的错误处理方案。错误的默认值是' strict',这意味着编码错误会引发UnicodeError。其他可能的值包括'忽略''替换',' xmlcharrefreplace',' backslashreplace'以及通过codecs.register_error()注册的任何其他名称,请参阅Codec Base Classes部分。有关可能的编码列表,请参阅标准编码部分。

在你的情况下:

msg.encode(getpreferredencoding(), 'backslashreplace')