Linux/Python:对Unicode字符串进行编码以便打印

19

我有一个相当大的Python 2.6应用程序,其中散布着许多打印语句。我始终使用Unicode字符串,并且通常效果很好。但是,如果我重定向应用程序的输出(例如“myapp.py>output.txt”),则偶尔会出现如下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128)

如果有人将LOCALE设置为ASCII,可能会出现同样的问题。我完全理解这个错误的原因。我的Unicode字符串中有些字符无法编码为ASCII码。很好,但是我希望我的Python程序尽力尝试打印一些可理解的内容,可能跳过可疑的字符或用它们的Unicode ID替换它们。

这个问题肯定很常见...如何处理这个问题的最佳实践是什么?我希望有一个解决方案,可以继续使用普通的“print”方法,但必要时可以修改所有出现的情况。

附言:我现在已经解决了这个问题。 解决方案既不是给出的任何答案。我使用了http://wiki.python.org/moin/PrintFails上ChrisJ在其中一个评论中提供的方法,即将sys.stdout替换为调用正确参数的unicode编码的包装器。效果非常好。


“ASCII” 如何成为一种语言环境? - Matt Ball
可能是重复的问题:如果命令行程序不确定stdout的编码,应该输出什么编码? - Ignacio Vazquez-Abrams
以下是两个可能有用的指针:http://wiki.python.org/moin/PrintFails - https://dev59.com/B3M_5IYBdhLWcg3wNwUv - ChrisJ
3个回答

18

如果您要转储到ASCII终端,请使用unicode.encode手动编码,并指定忽略错误。

u = u'\xa0'
u.encode('ascii') # This fails
u.encode('ascii', 'ignore') # This replaces failed encoding attempts with empty string

如果您想存储Unicode文件,请尝试以下方法:

u = u'\xa0'
print >>open('out', 'w'), u # This fails
print >>open('out', 'w'), u.encode('utf-8') # This is ok

5
我已经解决了这个问题。解决方法并不是给出的答案之一。我使用了ChrisJ在评论中提供的http://wiki.python.org/moin/PrintFails上提供的方法。也就是说,我用一个调用正确参数的unicode编码的包装器替换了sys.stdout。效果非常好。

2
我在给定的页面上没有看到任何评论。你能在这里复现你的解决方案吗? - Phil R

2

要么将所有的打印语句通过一种方法执行任意的Unicode -> UTF8转换,或者作为最后的手段,在您的site.py中更改Python的默认编码从ascii到utf-8。通常情况下,直接将Unicode字符串无过滤地打印到sys.stdout是一个不好的主意,因为Python会触发将Unicode字符串隐式转换为配置的默认编码(即ascii)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接