2016-08-24 32 views
1

私は、Unicodeコードポイントを含むファイルからデータを読み込むスクリプトを実行すると、問題なく動作します。しかし、別のアプリケーション経由で実行されると、次のエラーが発生しています。Unicodeファイルの読み込みUnicodeファイルの読み込み

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)

全く同じコードを同じデータファイルで実行しています。問題を複製したサンプルのデータファイルは、このようなものです:

¥ Α © § 

私は単純に読み込まれ、ファイルの内容を印刷するための非常にシンプルなPythonスクリプトsample.txt

これを呼ばれる:

with open("sample.txt") as f: 
    for line in f: 
     print(line) 

print("Done") 

これを実行コマンドラインから罰金。 Apache/CGI経由での実行は上記のエラーで失敗します。

答えて

1

問題へのヒントはopen機能の文書から来た:

In text mode, if encoding is not specified the encoding used is platform dependent: locale.getpreferredencoding(False) is called to get the current locale encoding. [Link]

プラットフォーム依存の提案環境変数。だから、自分のシェルにどのような環境変数が設定されているかを調べ、LANGen_US.UTF-8に設定されていることがわかりました。 Apacheによって設定された環境変数をダンプすると、LANGが見つからないことが判明しました。

ロケールを特定できない場合、PythonはデフォルトのファイルエンコーディングとしてASCIIを使用しています。その結果、序数がASCIIの範囲外になったときにエラーが発生しました。

これを修正するために、この環境変数をCGIスクリプトに設定しました。環境変数が何らかの形でユーザーのシェルから欠落している場合、それは通常の方法で設定することができ、あるいは単にによって:

export LANG=en_US.UTF-8 

または任意の好適なエンコーディングが望まれています。

ロケールがユーザーシェルにない場合は、viのようなテキストエディタでは文字が表示されないため、問題がはるかに顕著です。これは、Apache(または他のアプリケーション)から呼び出されたときに問題が発生した場合には、はるかに微妙でした。

関連する問題