2012-12-06 52 views
2

我有一個有趣的程序,顯示溫度。一切工作正常,直到我試圖從Conky使用它:僅當從其他程序運行時出現Unicode錯誤?

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

當您打印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配置)?在上面的例子中用utf8代替latin1來代替嘗試編碼。

另請參閱Python Unicode HOWTO,它指定如何處理輸出編碼。

+0

我所做的是在我的Conky配置中設置了'override_utf8_locale yes',然後我修改了腳本以創建一個新的'--output-encoding'參數,默認爲'utf8'。成功了!謝謝! –

0

嘗試設置編碼在你的src的文件這樣的頂部:

# coding: UTF-8 
+3

這不會奇蹟般地修復*輸出*編碼,這隻適用於python *如何讀取*源代碼*。 –

相關問題