1. ホーム
  2. python

UnicodeEncodeError: 'gbk' コーデックは位置 43 の文字 u'\u200e をエンコードできない: 不正なマルチバイト

2022-02-19 22:36:03

オリジナルリンク: 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でエンコードされています。

そのヘッダーセクションを抽出する。

<テーブル
1
2
3
4
5
<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を追加するという同様の説明を見たことがあり、それを参照しました。

Pythonの文字列デコードで不正な文字に遭遇した場合

そして、対応する構文へ。

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]です。

その後、よくあるタイプをまとめたので、興味のある方はご覧ください。

<スパン [要約】 Python 2.xでよくある文字エンコードとデコードのエラーとその解決法