2011-08-04 58 views
14

ファイルに文字列を書き込もうとしています(この文字列は、HTMLパーサBeautifulSoupによって私に渡されています)。ファイルに書き込むときのUnicodeEncodeError

)私はそれらを表示するには、「印刷」を使用することができますが、私はfile.writeを(使用したとき、私は次のエラーを取得する:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 6: ordinal not in range(128) 

は、どのように私はこれを解析することができますか?

答えて

11

英語以外の文字(Unicode文字が128を超えている)を含むUnicode文字列を、ASCIIバイト文字列が必要な文字列に渡すと、このエラーが発生します。 Pythonのバイトコードのデフォルトのエンコーディングは、「正確に128文字(英語)の文字を扱うASCII」です。これは、128を超えてUnicode文字を変換しようとするとエラーが発生する理由です。

ユニコード()

unicode(string[, encoding, errors]) 

コンストラクタは、署名ユニコード(文字列[、符号化、エラー])を有します。すべての引数は8ビットの文字列でなければなりません。

最初の引数は、指定されたエンコーディングを使用してUnicodeに変換されます。もし符号化引数をオフのまま場合は127より大きい文字は例えばエラー

として扱われるので、ASCII符号化は、変換ために使用される

s = u'La Pe\xf1a' 
print s.encode('latin-1') 

又は

write(s.encode('latin-1')) 

はlatin-1を使用してエンコードします

+0

それが出力だ文字列が有効なASCIIされていない「£123」 – Rory

+0

のような価格です。シャープ記号は、127のASCII範囲外のcharコード163です。 –

+0

これらの文字をエンコードできるエンコードを指定する必要があります。ファイルには文字は含まれません。それらはバイトを含んでいます。エンコーディングは、文字をバイトに変換します。 –

17

はい、約99.9%ベテランのPythonユーザーがこれまでに見たことがあります。

Googleに「python unicode」と入力すると、約1400万件の結果が得られます。最初はhttp://docs.python.org/howto/unicode.html悲惨な状況で全体の状況を説明する公式の文書です。 4番目はhttp://farmdev.com/talks/unicode/であり、より実践的な概観であり、それはあなたに答えを与えることができます。また、何が起こっているのかを理解することもできます。

あなたは実際にこれらの種類の概要を読んで理解する必要があります。本当に周りには何も起こっていません。テキストは難しいです。 「プレーンテキスト」のようなものはありません。何年もの間妥当なファクシミリがありませんでした。実際には何もありませんでした。しかし、Unicodeは少なくとも標準です。

http://www.joelonsoftware.com/articles/Unicode.htmlもお読みください。

+0

リンクありがとう!非常に便利な – tatlar

4

あなたの質問に対する答えは「コーデックを使用する」です。 appededコードは、いくつかのgettextマジック、FWIWも表示します。 Googleはこの問題にヒットの満ちているにもかかわらず

import codecs 

import gettext 

localedir = './locale' 
langid = wx.LANGUAGE_DEFAULT # use OS default; or use LANGUAGE_JAPANESE, etc. 
domain = "MyApp"    
mylocale = wx.Locale(langid) 
mylocale.AddCatalogLookupPathPrefix(localedir) 
mylocale.AddCatalog(domain) 

translater = gettext.translation(domain, localedir, 
           [mylocale.GetCanonicalName()], fallback = True) 
translater.install(unicode = True) 

# translater.install() installs the gettext _() translater function into our namespace... 

msg = _("A message that gettext will translate, probably putting Unicode in here") 

# use codecs.open() to convert Unicode strings to UTF8 

Logfile = codecs.open(logfile_name, 'w', encoding='utf-8') 

Logfile.write(msg + '\n') 

http://wiki.wxpython.org/Internationalizationは、私はそれはかなり難しい(それはUnicodeのPythonのドキュメントに実際にあるのではなく、埋め込まれた部分)は、この簡単な解決策を見つけることがわかりました。

だから... HTH ...

GAJ

+0

"シンプル"?それは、OPが気にしない機械の束を示している - 人々が正しい言語でテキストを見ていることを確認しようとしていない、特定のソースから特定の言語のテキストをつかんでファイルに入れようとしている。あなたのスナップの唯一の関連部分は、最初の行と最後の2つです。本当に "見つけにくい"のは、本当ですか?あなたはGoogleのために何をしましたか?私は 'UnicodeEncodeError: 'ascii'コーデックは文字をエンコードできませんでした。結果は十分役立つようです... –

関連する問題