5

私はあまりにも長い間エンコーディングに苦労してきましたが、今日はメンタル ブロックを大きく開放したいと考えています。

現在、リクエストを使用して多数の Web サイトをスクレイピングしています。HTTP ヘッダーを使用して、ページが使用しているエンコーディングを把握し、サイトのヘッダーが欠落している場合はchardetにフォールバックしていると言えます。そこから、ダウンロードしたバイトコードをデコードし、r.text.

すべて良い。

しかし、私が混乱しているのは、そこからテキストに対していくつかの作業を行い、それを stdout に出力して、印刷時にエンコーディングを提供することです。

 print foo.encode('utf-8')

問題は、私がそうすると、印刷されたものが台無しになることです。以下では、'判断' と '標準' という単語の間にダッシュを入れることを期待しています:

 Declaratory judgmentsStandard of review.

代わりに、4 つの小さな数字が入った箱型のものを取得します。もちろん、ここには表示されないようですが、数字は 0097 であると思います。これは、表示した場合に得られるものに対応しています。

repr(foo)
u'Declaratory judgments\x97Standard of review.'

それは理にかなっていますが、私のemdashはどこですか?

プロセスは次のように要約されます。

  1. リクエストはページをダウンロードし、テキストを Unicode オブジェクトにインテリジェントにデコードします
  2. 私はそれで働きます
  3. utf-8 にエンコードして出力します。

問題はどこですか?これは神話上の Unicode サンドイッチのように聞こえますが、明らかに何かが欠けています。

4

1 に答える 1

4

あなたは奇妙なことをしています。 cp1252\x97エンコーディングのemdashです。Unicode 文字列では、U+0097 END OF GUARDED AREAです。どういうわけか、cp1252 バイトを Unicode として読み取っています。この状態になったコードをさらに表示すると、さらに深く掘り下げることができます。

PS: Unicode サンドイッチはほとんど神話ではなく、目指すべき理想です! :)

于 2012-07-21T00:27:21.137 に答える