【问题标题】:Linux/Python: encoding a unicode string for printLinux/Python:编码用于打印的 unicode 字符串
【发布时间】:2011-02-24 20:21:11
【问题描述】:

我有一个相当大的 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 替换它们。

这个问题一定很常见......处理这个问题的最佳实践是什么?我更喜欢一个允许我继续使用普通旧“打印”的解决方案,但我可以在必要时修改所有出现的地方。

PS:我现在已经解决了这个问题。解决方案不是给出的答案。我使用了 http://wiki.python.org/moin/PrintFails 给出的方法,正如 ChrisJ 在其中一个 cmets 中给出的那样。也就是说,我将 sys.stdout 替换为使用正确参数调用 unicode 编码的包装器。效果很好。

【问题讨论】:

标签: python linux unicode encoding locale


【解决方案1】:

如果您要转储到 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

【讨论】:

    【解决方案2】:

    我现在已经解决了这个问题。解决方案都不是给出的答案。我使用了 http://wiki.python.org/moin/PrintFails 给出的方法,正如 ChrisJ 在其中一个 cmets 中给出的那样。也就是说,我将 sys.stdout 替换为使用正确参数调用 unicode 编码的包装器。效果很好。

    【讨论】:

    • 我在给定的页面上看不到任何 cmets。你能在这里重现你的解决方案吗?
    【解决方案3】:

    要么通过执行任意 unicode -> utf8 转换的方法包装所有打印语句,要么作为最后的手段,在 site.py 中将 Python 默认编码从 ascii 更改为 utf-8。一般来说,将未过滤的 unicode 字符串打印到 sys.stdout 是一个坏主意,因为 Python 会触发将 unicode 字符串隐式转换为配置的默认编码(即 ascii)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      相关资源
      最近更新 更多