UnicodeEncodeError: 'gbk' コーデックは位置 43 の文字 u'\u200e をエンコードできない: 不正なマルチバイト
オリジナルリンク: http://www.crifan.com/unicodeencodeerror_gbk_codec_can_not_encode_character_in_position_illegal_multibyte_sequence/
[質問】です。]
Pythonでページが取得されました。
http://blog.csdn.net/hfahe/article/details/5494895
htmlのソースコードで、その時点ではUTF-8でエンコードされています。
そのヘッダーセクションを抽出する。
<span class="link_title"><a href="/hfahe/article/details/5494895">
Presentation at Perl Conference 2008 Beijing - Developing High Performance Web Sites with Mason
</a></span>
タイトルテキスト
<テーブル Perl Conference 2008 Beijingにて発表 - MasonによるハイパフォーマンスなWebサイトの開発では、使ってください。
<テーブル titleUni = unicode(titleHtml, "UTF-8");または
<テーブル titleUni = titleHtml.decode("UTF-8");Unicode にデコードしますが、その後エラーになります。
<テーブル UnicodeEncodeError: 'gbk' codec can't encode character u'\u200e' in position 43 : illegal multibyte sequence
[解決プロセス】。]
1. Pythonのエンコード問題、GB18030、UTF-8、Unicodeなど、これまで何度も遭遇し、解決してきたことです。ここで不思議なのは、その
など、他のページでも同様に
http://blog.csdn.net/v_july_v/article/details/6543438
http://blog.csdn.net/v_july_v/article/details/5934051
など、抽出されたコンテンツに対応するものが、正しくUnicodeにデコードされます。
なぜなら、そのエンコーディング自体が確かにUtf-8だからです。
2. chardet.detectでその本当のエンコーディングを解析してみたところ、以下のような結果が得られました。
<テーブル encInfo= {'confidence': 0.99, 'エンコーディング': 'utf-8'}.は、他のウェブコンテンツでも同じ結果になります。
3. この問題で奇妙なのは、UTF-8関連のデコードエラーではなく、UTF-8をデコードするための呼び出し自体が、GBKデコードエラーでプロンプトが表示されることです。
4.他の投稿を見つけました。
Python UnicodeEncodeError:illegal multibyte sequence(不正なマルチバイト文字列
しかし、この議論は、UnicodeからGBKやGB2312にエンコードして、エラーが発生したときの話です。
そして、このエラーは、コンテンツ自体がUTF-8であり、その後Unicodeに戻そうとすると、GBKデコードエラーが表示される、というものです。
5. ここです。 中国語のUTF-8エンコーディングによるBOMタグの問題を探る 言及は、おそらくUTF-8のBOMが原因で適切にデコードできないため、htmlファイルとしてエクスポートされた返されたhtmlに移動してみて、表示するには、メモ帳++を使用して、結果はまだBOMがあるかどうかを参照していない、とにかく、テキストコンテンツは、表示することができますです。
その後、同様のコードも試してみました。
<テーブル titleUni = titleHtml[1:].decode("UTF-8");
titleUni = titleHtml[2:].decode("UTF-8");
しかし、どちらもまだ動作しません。
この後 ここで UTF-8でのBOMの問題の説明も見ましたが、やはり、私が望んでいたものとは違いました。
6. ここです。 Python Unicodeと中国語の処理 (ダイジェスト) をご覧ください。
<ブロッククオートs.decode('gbk', 'ignore').encode('utf-8′)
そこでふと、以前、不正な文字を無視するためにignoreを追加するという同様の説明を見たことがあり、それを参照しました。
そして、対応する構文へ。
str. デコード ( [ エンコーディング [, エラー ]] )
に登録されているコーデックを使って文字列をデコードします。 エンコーディング . エンコーディング はデフォルトの文字列エンコーディングに設定されます。 エラー は、別のエラー処理方式を設定するために与えられるかもしれません。 'ストリクト' つまり、エンコードエラーは ユニコードエラー . その他の可能な値は '無視' , '置換' で登録した名前と codecs.register_error() をご覧ください。 コーデック基本クラス .
バージョン2.2での新機能です。
バージョン2.3での変更点:他のエラー処理スキームへの対応を追加。
バージョン 2.7 で変更: キーワード引数のサポートを追加。
試してみました。
<テーブル titleUni = titleHtml.decode("UTF-8", '無視');とします。
<テーブル titleUni = titleHtml.decode("UTF-8", 'replace')。でも、結果はやっぱり。
<テーブル print "titleUni=",titleUni。上記のエラー "'gbk' codec can't encode" が発生します。
しかし、うっかりしていたのですが、titleUniを出力する前に、デバッグ用のコードとして、次のような行が追加されていました。
<テーブル print "len(titleUni)=",len(titleUni)を出力します。つまり、ここでの変数titleUniは、Unicodeに正常にデコードされている、つまり上記のデコードは正常であるということです。
続いて、前回を再試行します。
<テーブル titleUni = titleHtml.decode("UTF-8");結果は同じ、つまりprint "len(titleUni)=",len(titleUni);もちゃんと出力される。
すると、"gbk' codec can't encode"エラーの根本原因は、以前のものについては、どちらを使っても、"gbk' codec can't encode"になることが明らかになったのです。
titleHtml.decode("UTF-8") とします。
まだ
titleHtml.decode("UTF-8", 'ignore')を実行します。
まだ
titleHtml.decode("UTF-8", 'replace')を実行します。
通常の titleUni の Unicode 文字を取得して、この Unicode 文字について、印刷する必要がある場合、ローカルシステムが Win7 の cmd であるため、デフォルトのコードページが CP936、すなわち GBK エンコード、したがって、まず最初に上記の Unicode titleUni を GBK にエンコードし、次に cmd でそれを表示する必要があります、titleUni は GBK で表示できないいくつかの文字を含むため、プロンプト "'gbk' コーデックは " エラーでエンコードできない結果となりました。
[まとめ】をご覧ください。]
この(クラスの)問題に対して。
(1) UnicodeEncodeError -> Unicodeでエンコードする際に問題があることを示す。
(2) 'gbk' コーデックが文字をエンコードできない -> Unicode文字をGBKとしてエンコードする際に問題があることを示しています。
この場合、Unicodeの文字にGBKに変換できない文字が含まれている可能性が高いことが多いようです。
その解決策は
- 解決策1.
ユニコード文字をエンコードする際に、エンコードできない文字を無視するignoreパラメータを追加し、GBKとして正しくエンコードできるようにします。
対応するコードは
<テーブル gbkTypeStr = unicodeTypeStr.encode(" GBK "。 '無視' );- オプション 2.
または、GBK符号化されたスーパーセットGB18030に変換する(つまり、GBKはGB18030のサブセットである)こと。
<テーブル gb18030TypeStr = unicodeTypeStr.encode(" GB18030 ")。対応する取得文字は GB18030 で符号化されています。
[オフトピック】。]
上記について、元のutf-8文字をUnicodeに変換する場合、実は変換もした方が安全なのではと思います。
titleUni = titleHtml.decode("UTF-8") とします。
に置き換えてください。
titleUni = titleHtml.decode("UTF-8", '無視');
これにより、比較的、取るに足らない特殊文字でも正常にエンコードできるようになり、エンコードエラーを回避し、プログラムの堅牢性を向上させることができます。
[追記2012-12-01]です。
その後、よくあるタイプをまとめたので、興味のある方はご覧ください。
関連
-
PipePipeを使った最適化コードの書き方を学ぶPythonプログラミング
-
[解決済み] Tkinterのコールバックで奇妙な例外が発生する
-
[解決済み] PyTorch - contiguous()は何をするのですか?
-
[解決済み] TypeError: 'unicode'オブジェクトは呼び出し可能ではありません。
-
[解決済み] AttributeError:'list' object has no attribute 'astype' を解決するにはどうしたらいいですか?
-
[解決済み] Tkinterのコマンド "iconbitmap "を使ってウィンドウのアイコンを設定する
-
[解決済み] Project Euler #3 with python - MOST EFFICIENT METHOD [クローズド].
-
[解決済み] 改行までのtqdm印刷
-
[解決済み] 非タイプ」オブジェクトを暗黙のうちにstrに変換できない - Python3
-
非対応Pickleプロトコル
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] '_pywrap_tensorflow_internal' という名前のモジュールはありません。
-
[解決済み】WindowsError: [Error 126] 指定されたモジュールが見つかりません。
-
[解決済み】TypeError: タプルのインデックスは整数でなければならず、strであってはならない
-
[解決済み] pythonでjsonオブジェクトを読み込む方法 [重複]。
-
[解決済み] pipでScipyをインストールできない
-
[解決済み] 私のコードに「無効なエントリ」と言うことができず、常にintでエラーになります。
-
[解決済み] IOError: [Errno 22] invalid mode ('r') or filename: 'c:\Python27╱test.txt' [duplicate].
-
[解決済み] float が配列に格納されている任意の float に近いかどうかをチェックします。
-
jinja2.exceptionsでTemplateNotFoundエラーが発生しました。
-
pythonの未解決のリファレンスソリューション