2016-08-29 12 views
0

環境変数LANGでUnicodeEncodeErrorををスロー:私は私のDebianシステム上でそれを実行すると、予想通りのPython 3は、私は次のPythonスクリプトを持っている= C

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 

print('☺') 

、それは、次の出力を生成します。

$ ./test.py 
☺ 
$ 

$ LANG=C ./test.py 
Traceback (most recent call last): 
    File "./test.py", line 4, in <module> 
    print('\u263a') 
UnicodeEncodeError: 'ascii' codec can't encode character '\u263a' in position 0: ordinal not in range(128) 
$ 
:私は「C」に、 LANG環境変数を設定することにより、ロケールを変更しかし

は、スクリプトがUnicodeEncodeErrorスロー0

この問題は、このスクリプトがブート中や組み込みシステムなどの最小限の環境で実行されないようにします。また、多くの既存のPythonプログラムは、LANG=Cで実行すると壊れる可能性があります。 "C"の場所で実行されたためにおそらく壊れたプログラムのStackoverflowにHere's an exampleがあります。

これはPythonのバグですか?これを防ぐ最善の方法は何ですか?

+3

をfdに、適切にUnicodeをエンコードする適切な値にLC_CTYPEを設定、またはバイナリを作成する方法をお知りになりたい場合は、「これは、Pythonのバグですか?」 - PythonにWHITE SMILING FACEを持たないロケールで印刷するように指示しています。私はそれがPythonのせいだとは思わない。 – jwodder

答えて

3

これは、Python 3がロケール設定を使用して出力文字エンコーディングを推定するためです。つまり、Pythonはあなたがlocaleコマンドを実行したときLC_CTYPEのために表示されるロケールを使用します:あなたはCLC_CTYPEを強制した場合

% locale 
... 
LC_CTYPE="en_US.UTF-8" 
... 

を、その後、PythonはそのASCII出力エンコーディングとして使用すべきであると仮定します。 ASCIIにはU+263Aのマッピングがありません。

あなたはPythonが1

+0

これは、スクリプトをポータブルにするために、Unicode文字列を印刷しようとする前に、常に現在のロケール設定が何であるかをテストすべきですか? – hedgie

+1

@hedgie ASCII以外の文字を印刷する本当の移植可能なスクリプトは作成できません。サポートしていない端末が多すぎます。 – bobince

関連する問題