2

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

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

4

2 回答 2

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

这个帖子似乎暗示编码为 UTF-8 也是一种选择(取决于 Conky 配置)?latin1在上面的示例中替换utf8为尝试该编码。

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

于 2012-12-06T07:57:18.433 回答
0

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

# coding: UTF-8
于 2012-12-06T07:32:16.523 回答