7

特定のエンコーディング 16 進数を含まない Unicode 文字列を印刷しようとしています。UTF-8 の html ヘッダーにエンコーディング タイプを持つ facebook からこのデータを取得しています。タイプを印刷すると、Unicodeと表示されますが、unicode-escapeでデコードしようとすると、エンコードエラーがあると表示されます。デコード メソッドを使用するとエンコードしようとするのはなぜですか?

コード

a='really long string of unicode html text that i wont reprint'
print type(a)
 >>> <type 'unicode'>   
print a.decode('unicode-escape')
 >>> Traceback (most recent call last):
  File "scfbp.py", line 203, in myFunctionPage
    print a.decode('unicode-escape')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 1945: ordinal not in range(128)
4

3 に答える 3

8

失敗しているのはデコードではありません。結果をコンソールに表示しようとしているからです。print を使用すると、ASCII であるデフォルトのエンコーディングを使用して文字列がエンコードされます。print を使用しないでください。動作するはずです。

>>> a=u'\\u20ac とその他のテキストを含む非常に長い文字列'
>>> タイプ(a)
<タイプ「ユニコード」>
>>> a.decode('unicode-escape')
u'\u20ac とその他のテキストを含む非常に長い文字列'
>>> print a.decode('unicode-escape')
トレースバック (最新の呼び出しが最後):
  ファイル "<stdin>"、1 行目、
UnicodeEncodeError: 'ascii' コーデックは位置 30 の文字 u'\u20ac' をエンコードできません: 序数が範囲外です(128)

IDLE またはユニコードを出力できる他のインタープリターを使用することをお勧めします。そうすれば、この問題は発生しません。


更新: これは、バックスラッシュが 1 つ少ない状況と同じではなく、デコード中に失敗するが、同じエラー メッセージが表示されることに注意してください。

>>> a=u'\u20ac とその他のテキストを含む非常に長い文字列'
>>> タイプ(a)
<タイプ「ユニコード」>
>>> a.decode('unicode-escape')
トレースバック (最新の呼び出しが最後):
  ファイル "<stdin>"、1 行目、
UnicodeEncodeError: 'ascii' コーデックは位置 30 の文字 u'\u20ac' をエンコードできません: 序数が範囲外です(128)
于 2011-01-25T23:17:32.713 に答える
3

コンソールに出力すると、Python は文字列を端末の文字セットにエンコード (変換) しようとします。これが UTF-8 でない場合、または文字列内のすべての文字をマップしないものである場合、泣き言を言って例外をスローします。

これは、たとえばトルコ語の文字を含むデータをすばやく処理するときに、時々私を悩ませます。

Windows コマンド プロンプトから python.exe を実行している場合は、ここでいくつかの解決策を見つけることができます: What encoding/code page is cmd.exe using . 基本的にコードページを変更できますが、chcpかなり面倒です。Mark のアドバイスに従い、IDLE のようなものを使用します。

于 2011-01-25T23:20:38.210 に答える
2
>>> print type(a)
<type 'unicode'>
>>> a.decode('unicode-escape')

デコード方法を使用すると、なぜエンコードしようとするのですか?

Unicodeにデコードし、からエンコードするためです。ユニコード文字列をユニコードにデコードしようとしました。次に最初に行うことは、ASCIIコーデックを使用して文字列に変換しようとすることです。それがあなたが得る理由です:

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

注意:Unicodeはエンコーディングではありません。他のすべては、ascii、utf8、latin-1などです。

この暗黙のエンコーディングは、人々を混乱させるため、Python3ではなくなりました。

于 2011-01-26T11:48:19.477 に答える