Python爬虫基礎|文字列と符号化
4327 ワード
python文字列符号化の問題は,爬虫過程でファイルに出力してもDBデータベースに出力しても常に迂回できないような気がするので,今回出会った問題に乗じて学習記録を作成する.
Unicode
現在のコンピュータシステムで通用する文字コードの働き方をまとめます.
コンピュータメモリではUnicode符号化を統一し、ハードディスクに保存する必要がある場合や転送する必要がある場合はUTF-8符号化に変換する.
Pythonでは に変換することを示す. に変換することである.
多くのPythonのソースファイルのヘッダには、次のような声明が表示されます.
これは、宣言元コードのテキストが
Pythonはバイト列と文字列の間で気づかないように変換しようとした.異なる変換では、条件が許容される場合、Pythonは
例えば、
この問題を解決する1つの方法は、コードの先頭から
以下に、Pythonの文字コードを処理するためのいくつかのアドバイスを示します.すべてのテキスト文字列は、 バイト列を文字列に復号するには、 は、 アプリケーションが外部からデータを読み出す場合、それをバイト列、すなわちstrタイプと見なし、 が標準ストリームを操作する場合、環境変数
参考資料
廖雪峰の公式サイト-文字列とコードUnicode HOWTOhttp://www.tuicool.com/articles/2MVRVv7 https://gist.github.com/x7hub/178c87f323fbad57ff91 http://python.jobbole.com/86578/
Unicode
Unicode
とはコンピュータがこの星の多くの言語をサポートできる暗号兵器です.Unicode
までは、ASCII
が使われていました.ASCIIコードは非常に簡単で、英語の文字ごとに7ビットのバイナリ数でコンピュータに保存され、その範囲は32~126です.ユーザがファイルに大文字Aを入力すると、コンピュータはAのASCII
符号値65
をディスクに書き込み、コンピュータがファイルを読み出すと、まず65を文字Aに変換して画面に表示する.ASCIIコードのファイルは小さくて読みやすい.1つのプログラムは、ファイルのバイトごとに簡単に読み出し、対応する数字を文字に変換して表示するだけでよい.しかしASCII
の符号化には限界があり、後に8ビットのバイナリ方式で格納に拡張しても、何千もの文字を必要とする非ヨーロッパ語系の言語には少なすぎる.例えば、中国語を処理するには明らかに1バイトでは足りない.少なくとも2バイトが必要で、ASCII
の符号化と衝突することはできない.このようにして、中国はGB2312
の符号化を制定した.世界には百種類以上の言語があり、日本はShift_JIS
に日本語を編成し、韓国はEuc-kr
に韓国語を編成し、各国には各国の基準があり、衝突は避けられない.その結果、多言語混在テキストには
が表示されます.Unicode
はこの時点で誕生し、1つ以上のバイトを使用して1つの文字を表す方法によってASCII
の制限を突破した.このようなメカニズムの下で、Unicode
は90000文字を超えることを表すことができる.新しい問題はまた現れた:Unicode
符号化に統一すれば、乱符号化問題はそれから消えた.しかし、あなたが書いたテキストが基本的にすべて英語であれば、Unicode
符号化でASCII
符号化よりも2倍の記憶空間が必要であり、記憶と伝送では非常にお得ではありません.そのため、節約の精神に基づいて、Unicode符号化を“ ”
に変換するUTF-8
符号化が現れた.UTF-8
符号化Unicode
文字を異なる数字の大きさに応じて1~6バイトに符号化し、よく使われる英語のアルファベットを1バイトに符号化し、漢字は通常3バイトで、辺鄙な文字だけが4~6バイトに符号化される.転送するテキストに英語の文字が大量に含まれている場合は、UTF-8
で符号化するとスペースを節約できます.現在のコンピュータシステムで通用する文字コードの働き方をまとめます.
コンピュータメモリではUnicode符号化を統一し、ハードディスクに保存する必要がある場合や転送する必要がある場合はUTF-8符号化に変換する.
Pythonでは
Unicode
は中間符号と見なされ、異なる符号化間で変換する場合は、通常、文字列をdecode
に復号してUnicode
に符号化し、Unicodeから別の符号化に符号化する(encode
).decode
:他の符号化文字列をUnicode
符号化に変換する役割を果たす、例えばname.decode(“GB2312”)
は、GB2312
符号化文字列nameをUnicode
符号化encode
:Unicode
の符号化を他の符号化文字列に変換する役割は、例えば、name.encode(”GB2312“)
、Unicode
の符号化を示す文字列nameをGB2312
の符号化多くのPythonのソースファイルのヘッダには、次のような声明が表示されます.
# coding:utf-8
これは、宣言元コードのテキストが
UTF-8
であることを意味し、すなわち、Python解釈器にファイルのテキストをUTF-8
で符号化された文字列と見なすように伝え、宣言された符号化はファイルの符号化と一致しなければならない.コードでは、ネットワークなどの他のソースのテキストを処理することが多いが、それらの符号化は必ずしもUTF-8
ではないので、符号化変換を行う必要がある.Pythonはバイト列と文字列の間で気づかないように変換しようとした.異なる変換では、条件が許容される場合、Pythonは
およびunicode
文字列で直接変換しようとします.例えば、
とunicode
バイトの列が一緒に接続されている場合.しかしencodingを用いずに異なるタイプ間で変換することは意味がない.したがってPythonは、sys.setdefaultencoding()
によって指定されるデフォルトの符号化に依存する.ほとんどのプラットフォームでは、デフォルトはASCII
符号化です.しかし、すべての変換について、この符号化を使用するのはほとんど間違っている.このデフォルト符号化は、手動で符号化を指定しない場合にstr()
またはunicode()
を呼び出すか、関数が文字列をパラメータとして呼び出されますが、他のタイプのパラメータが渡される場合に使用されます.これは、文字列オブジェクトが互いに変換されたときに文字符号化が指定されていないため、UnicodeEncodeError UnicodeDecodeError
エラーが発生することが多いためです.例えば、
unicode
およびstr
タイプに対して+
により接合された場合、出力結果はunicode
タイプであり、strタイプの文字列をdecode()
方法によりunicode
に復号してから接合することに相当する.この場合、復号時に符号化タイプが明確に指定されていない場合、エラーが発生する可能性があります.この問題を解決する1つの方法は、コードの先頭から
sys.setdefaultencoding()
を呼び出して、デフォルトの符号化を実際に使用される符号化に設定することである.しかし、これは問題を隠すだけで、最初はいくつかのテキスト処理の問題を解決することができますが.しかし、多くのアプリケーション、特にネットワークアプリケーションでは、異なる場所で異なるテキスト符号化が使用されるため、実際の実行可能性に欠けている.以下に、Pythonの文字コードを処理するためのいくつかのアドバイスを示します.
unicode
タイプではなく、str
タイプである必要があります.var.decode(encoding)
、例えばvar.decode(‘utf-8’)
の正しい復号を使用する必要がある.テキスト文字列をバイトに符号化し、var.encode(encoding)
を使用します.unicode
文字列に対してstr()
を使用しないでください.また、符号化を指定せずにunicode()
をバイト列に対して使用しないでください..decode()
を呼び出してテキストとして解釈する.同様に、テキストが外部に送信されると、常に.encode()
がテキストに呼び出される.PYTHONIOENCODING
の値を変更して標準ストリームのデフォルト符号化を設定することができ、sys.stdin.encoding
およびsys.stdout.encoding
の値は所望の符号化である.参考資料
廖雪峰の公式サイト-文字列とコードUnicode HOWTOhttp://www.tuicool.com/articles/2MVRVv7 https://gist.github.com/x7hub/178c87f323fbad57ff91 http://python.jobbole.com/86578/