【问题标题】:Unicode error only when running from another program?仅在从另一个程序运行时出现 Unicode 错误?
【发布时间】:2012-12-06 07:18:01
【问题描述】:

我有一个显示温度的有趣程序。一切正常,直到我尝试从 Conky 使用它:

Traceback (most recent call last):
  File "/home/naftuli/Documents/i7zdaemon/get-i7z-value", line 85, in <module>
    main()
  File "/home/naftuli/Documents/i7zdaemon/get-i7z-value", line 28, in main
    get_temp_value(args)
  File "/home/naftuli/Documents/i7zdaemon/get-i7z-value", line 63, in get_temp_value
    print fmt % (temp if not args.in_fahrenheit else temp * (9.0/5.0) + 32, )
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb0' in position 2: ordinal not in range(128)

为什么这只是在从另一个程序中使用时抛出错误?当我直接从终端运行它时,一切看起来都很好。

这就是我正在做的事情:

fmt = u"%d\u00B0C" if not args.in_fahrenheit else u"%d\u00B0F"
# ...
print fmt % (temp if not args.in_fahrenheit else temp * (9.0/5.0) + 32, )

最后一行杀死了一切。什么给了?

【问题讨论】:

    标签: python unicode


    【解决方案1】:

    当您打印 unicode 时,必须对打印的文本进行编码以匹配用于输出流的任何编码。例如,对于 Linux 终端,现在通常是 UTF-8。

    但是当您使用不同的程序来运行您的 python 脚本时,输出流编码(管道或终端以外的程序窗口)可能会使用 不同的 编码。在这种情况下,似乎没有设置编码,python 然后回退到 ASCII。 \u00B0 字符无法编码为 ASCII,编码失败。

    也许对于这个程序,打印一个小写的o 就足够了?

    或者,正如Conky FAQ 所暗示的,明确编码为拉丁语 1 (ISO 8859-1) 以输出度数符号:

    print (fmt % (temp if not args.in_fahrenheit else temp * (9.0/5.0) + 32, )).encode('latin1')
    

    this posting 似乎暗示编码为 UTF-8 也是一种选择(取决于 Conky 配置)?将上面示例中的 latin1 替换为 utf8 以尝试使用该编码。

    另请参阅Python Unicode HOWTO,它指定了如何处理输出编码。

    【讨论】:

    • 我所做的是在我的 Conky 配置中设置了 override_utf8_locale yes,然后我修改了我的脚本以添加一个新的 --output-encoding 参数,默认为 utf8。工作!谢谢!
    【解决方案2】:

    尝试像这样在 src 文件的顶部设置编码:

    # coding: UTF-8
    

    【讨论】:

    • 这不会神奇地修复 output 编码,这只适用于 python 如何读取 源代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多