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代わりにそのエンコーディングを試してください。

出力エンコーディングの処理方法を指定するPythonUnicodeHOWTOも参照してください。

于 2012-12-06T07:57:18.433 に答える
0

次のように、srcファイルの先頭にコーディングを設定してみてください。

# coding: UTF-8
于 2012-12-06T07:32:16.523 に答える