17

これはコードです:

print '"' + title.decode('utf-8', errors='ignore') + '",' \
      ' "' + title.decode('utf-8', errors='ignore') + '", ' \
      '"' + desc.decode('utf-8', errors='ignore') + '")'

title と desc は Beautiful Soup 3 ( p[0].textp[0].prettify ) によって返され、BeautifulSoup3 のドキュメントからわかる限り、UTF-8 でエンコードされています。

私が走れば

python.exe script.py > out.txt

次のエラーが表示されます。

Traceback (most recent call last):
  File "script.py", line 70, in <module>
    '"' + desc.decode('utf-8', errors='ignore') + '")'
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 264
: ordinal not in range(128)

ただし、実行すると

python.exe script.py

エラーは発生しません。出力ファイルが指定されている場合にのみ発生します。

出力ファイルで適切な UTF-8 データを取得するには?

4

4 に答える 4

12

コーデックモジュールを使用して、Unicodeデータをファイルに書き込むことができます

import codecs
file = codecs.open("out.txt", "w", "utf-8")
file.write(something)

「print」出力を標準出力に出力します。コンソールがutf-8をサポートしていない場合は、stdoutをファイルにパイプ処理しても、このようなエラーが発生する可能性があります。

于 2012-04-04T20:44:09.330 に答える
7

この場合のWindowsの動作は少し複雑です。他のアドバイスに耳を傾け、文字列に内部的にユニコードを使用し、入力中にデコードする必要があります。

あなたの質問に対して、stdoutリダイレクトの場合はエンコードされた文字列を印刷する必要があります(どのエンコードかを知っているだけです!)が、単純な画面出力の場合はユニコード文字列を印刷する必要があります(PythonまたはWindowsコンソールは適切なエンコードへの変換を処理します)。

スクリプトを次のように構成することをお勧めします。

# -*- coding: utf-8 -*- 
import sys, codecs
# set up output encoding
if not sys.stdout.isatty():
    # here you can set encoding for your 'out.txt' file
    sys.stdout = codecs.getwriter('utf8')(sys.stdout)

# next, you will print all strings in unicode
print u"Unicode string ěščřžý"

更新:他の同様の質問も参照してください:Pythonでstdoutを配管するときに正しいエンコーディングを設定する

于 2012-04-04T22:08:19.817 に答える
1

テキストを印刷するために Unicode に変換しても意味がありません。データを Unicode で処理し、出力用のエンコードに変換します。

代わりにコードが行うこと: Python 2 を使用しているため、デフォルトの文字列型 ( str) はバイト文字列です。ステートメントでは、いくつかの utf エンコードされたバイト文字列から始めて、それらを Unicode に変換し、それらを引用符で囲みます (通常str、1 つの文字列に結合するために Unicode に強制されます)。次に、このユニコード文字列を に渡すとprint、 にプッシュされsys.stdoutます。そのためには、それをバイトに変換する必要があります。Windows コンソールに書き込んでいる場合は、何らかの方法でネゴシエートできますが、通常のダム ファイルにリダイレクトすると、ascii にフォールバックして文句を言います。

print解決策: Unicode 文字列を指定しないでください。選択した表現に自分で「エンコード」します。

print "Latin-1:", "unicode über alles!".decode('utf-8').encode('latin-1')
print "Utf-8:", "unicode über alles!".decode('utf-8').encode('utf-8')
print "Windows:", "unicode über alles!".decode('utf-8').encode('cp1252')

リダイレクトすると、これらすべてが問題なく機能するはずです。画面では正しく表示されない可能性がありますが、メモ帳などで出力ファイルを開き、エディターがフォーマットを表示するように設定されているかどうかを確認してください。(Utf-8 は、検出される可能性がある唯一のものです。cp1252 は、おそらく Windows のデフォルトです)。

それを理解したら、コードをクリーンアップし、ファイル出力に print を使用しないようにします。codecsモジュールを使用し、codecs.openプレーン オープンの代わりにファイルを開きます。

PS。文字列をデコードする場合utf-8、Unicode への変換は無損失でなければなりません:errors=ignoreフラグは必要ありません。これは、ascii や Latin-2 などに変換するときに適切で、ターゲットのコードページに存在しない文字を削除したいだけです。

于 2012-04-04T21:30:44.753 に答える