2011-06-28 9 views
1

pythonを使用していくつかの部分を間違いなく選んでいますか?ここでは満足できる答えは見られませんでした。コーデックとutf-8に関するpythonのnoobに関する質問

私は墓のを持っているいくつかの作品、accuteのetcとJSONのUTF-8のファイルを持っている....私は(例えば)コーデックを使用して持っている:print'ingについては

str=codecs.open('../../publish_scripts/locations.json', 'r','utf-8') 
locations=json.load(str) 

for location in locations: 
    print location['name'] 

、ん何か特別な必要がありますか?これは、次の
アスキーそれは電子accuteの正しいUTF-8値のように見える位置5に

を\のXE9 『」コーデックが文字のuをエンコードすることはできません』私を与えています。私はprint'ingと何か間違っていると思う。反復によってそれが失われる原因はutf-8'nessですか?

PHPとRubyのバージョンはutf-8をうまく処理します。それらの言語では、Pythonではできない緩みがありますか?

thx

+1

[UTF-8はUnicodeではありません。](http://www.joelonsoftware.com/articles/Unicode.html) –

答えて

3

codec.open()デコード提供したコーデック(utf-8)を使用してファイルの内容をデコードします。次に、PythonのUnicodeオブジェクト(文字列オブジェクトと同様に動作する)があります。

Unicodeオブジェクトを印刷する通常asciiデフォルトのコーデックを使用して、(舞台裏)エンコードimplictの原因となります。 asciiがすべての文字をエンコードできない場合は失敗します。それを印刷するには

、あなたは、このように最初エンコードそれを、する必要があります

for location in locations: 
    print location['name'].encode('utf8') 

EDIT:あなたの情報については

json.load()は実際には何codecs.open()あるファイルのようなオブジェクトを(取ります戻る)。その時点での文字列とUnicodeオブジェクトの両方ではなく、ファイルの周りの反復可能なラッパーです。デフォルトjson.load()ことで

は、あなたのコードスニペットを簡素化することができるように、ファイルをエンコードUTF8れることを想定しています

locations = json.load(open('../../publish_scripts/locations.json')) 
for location in locations: 
    print location['name'].encode('utf8') 
0

これはPHPと同じです。 UTF8文字列は印刷するのが良いです。

2

あなたはおそらく正しくファイルを読んでいます。印刷中にエラーが発生します。 PythonはASCIIにUnicode文字列を変換しようと、5

が代わりにこれを試してみてくださいな位置に文字に失敗:

print location['name'].encode('utf-8') 

あなたの端末がUTF-8形式で出力を期待するように設定されている場合は、この意志正しく印刷してください。

+0

申し訳ありませんが、私はおそらく1つしか受け入れることができません。 – timpone

0

標準のストリームは、非ASCII文字、Python2の文字io、および一部のsite.pyの設定で壊れています。基本的には、スクリプトの非常に早い段階でsys.setdefaultencoding('utf8')(またはシステムロケールのエンコーディングが何であれ)が必要です。 ubuntuに同梱されているsite.pyを利用するにはimp.reload(sys)sys.setdefaultencodingが必要です。あるいは、sys.stdout(とstdinとstderr)をユニコード対応のリーダ/ライタにすることができます。これはcodecs.getreader/getwriterから得ることができます。

+0

何も_broken_はありません。ワイドなデフォルトのエンコーディングは悪い考えです。それはあなたのスクリプトを越える結果をもたらす可能性があります。明示的にはるかに良い。途中でデコードし、途中でエンコードします。 –

+0

文字列に対して 'print'が動作しないのは私の意見では壊れています。そして、これがシステムのエンコーディングとまったく同じものであるときにエンコーディングコールを使ってコードをペーストすると、私は冗長になります。 – Tobu

関連する問題