仅在从其他程序运行时出现Unicode错误?

时间:2012-12-06 07:18:01

标签: python unicode

我有一个显示温度的有趣程序。一切正常,直到我尝试从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, )

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

2 个答案:

答案 0 :(得分:2)

打印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,其中指定了如何处理输出编码。

答案 1 :(得分:0)

尝试在src文件的顶部设置编码,如下所示:

# coding: UTF-8