1. ホーム
  2. python

python reports UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 4: ordinal not in range.

2022-02-19 07:01:20

Pythonのエンコードとデコードは、unicodeとstrの相互変換です。エンコーディングはunicode -> strで、一方デコーディングは 
あとは、どのタイミングでエンコード、デコードを行うかの判断が問題です。ファイル冒頭の"encoding directive"、つまり# -*-codingについてです。-*- という文がありますが、PythonのデフォルトのスクリプトファイルはUTF-8でエンコードされているので、ファイル内にUTF-8のエンコード範囲外の文字がある場合は"encoding directive"を使って修正するようにしましょう。について  sys .defaultencoding, これは、デコードの方法が明示的に指定されていない場合に使用されます。例えば、次のようなコードです。 

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
s = 'Chinese' # Note that str here is of type str, not unicode 
s.encode('gb18030') 





このコードは、s を gb18030 フォーマットに再エンコードする、つまり unicode -> str 変換を行います。s 自身は str 型なので 
Pythonはsをgb18030にエンコードする前に自動的にunicodeにデコードします。デコードはpythonが自動的に行い、デコード方法を指定しないので、pythonは  sys .defaultencoding デコードの指定方法。多くの場合  sys .defaultencodingは 
ANSCIIの場合、sがこの型でない場合はエラーになります。上の例で、私の  sys .defaultencoding は anscii で、s のエンコーディングはファイルのエンコーディングと同じ utf8 なので、エラーになります。 
UnicodeDecodeError: 'ascii' コーデックは、位置のバイト 0xe4 をデコードできません。 
0: 序数が範囲(128)内ではない 
この場合、エラーを修正する方法は2つあります。 
1つは、sがどのようにエンコードされているかを明示的に示すことです。 
#! /usr/bin/env python 
# -*- coding: utf-8 -*- 

s = 'Chinese' 
s.decode('utf-8').encode('gb18030') 






次に  sys .defaultencoding は、ファイルのエンコード方法です。 
</pre><p><pre name="code" class="python">#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
import sys 
reload(sys) # Python2.5 removes the sys.setdefaultencoding method after initialization, so we need to reload 
sys.setdefaultencoding('utf-8') 

str = 'Chinese' 
str.encode('gb18030')





読み終えたら、次のように変更します。

print "<p>addr:", form["addr"].value.decode('gb2312').encode('utf-8') 
正常に通過しました。

<スパン <スパン このように書いた理由をまとめると :

1. 取得したデータが現在のスクリプトで宣言されているエンコーディングと一致しない場合、エンコーディング変換を行う。

2. まずデータを独自のエンコード形式でunicodeに変換し、unicodeをutf8でエンコードする

3. なぜ私のブラウザはgb2312でエンコードされたデータをサーバーに送り返すのでしょうか。それはクライアントのシステムエンコーディングと関係があるはずです。