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でエンコードされたデータをサーバーに送り返すのでしょうか。それはクライアントのシステムエンコーディングと関係があるはずです。
関連
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】ImportError: libcuda.so.1: 共有オブジェクトファイルを開くことができない
-
[解決済み】ZeroDivisionErrorの取得:ゼロによる整数の除算またはモジュロ
-
[解決済み】「pymysql」という名前のモジュールがない
-
[解決済み] NumPyの配列はJSONシリアライザブルではない
-
[解決済み] MissingSectionHeaderError: ファイルにセクションヘッダがない
-
[解決済み] AttributeError: 'int' オブジェクトには 'isdigit' という属性がありません。
-
[解決済み] Pandasシリーズの最後の要素にアクセスする方法は?
-
[解決済み] sklearnのPLSRegressionです。"ValueError:配列にinfやNaNを含んではいけない"
-
[解決済み] defaultdictをdictに変換する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: 文字バッファオブジェクトを期待する
-
[解決済み】Tkinterでウィンドウを閉じる関数
-
Pythonのパフォーマンスチューニングのための10のヒント まとめ
-
[解決済み] CUDAをpytorchで使う?
-
[解決済み] np.r_は何をするのですか(numpy)?
-
SyntaxErrorの概要:Pythonのエラーのための無効な構文
-
'datetime.datetime' に 'datetime' という属性がない問題
-
UnicodeDecodeError: 'ascii' コーデックは、ポジションソリューションのバイト 0xe6 をデコードできません。
-
ソリューションエラーです。PEP 517 を使用する暗号用ホイールがビルドできず、直接インストールすることができない
-
tkinter 入力ボックスの値を取得する AttributeError: 'NoneType' オブジェクトには 'get' 属性がない Solution