こんにちは。
今日は文字コードの判定について書きます。
◯文字コードの識別
もう基本UTF-8にしろよって感じなんですけど、たまにアップロードされたファイルの文字コードがなにか知りたいとかっていうシーンがあります。
今回はそれをPythonでやろうというものなのですが、そもそも文字コードを完璧に識別することはできません。完璧にやろうとすると、どこかから識別してもらうしか方法は基本的にありません。
しかし、バイトシーケンスのエンコーディングを識別するために、何もできないかというとそうでもありません。
バイトストリームが人の読むプレーンテキストだと仮定すると、言語にもルールがあるので、ヒューリスティックな方法や統計手法を使ってエンコーディングを探し出すことはできます。たとえば、ある特定のバイト値が結構あれば、このエンコーディングだな、みたいな感じです。
PyPIから提供されているchardetというパッケージは、対応している30種類のエンコーディングをそんな感じで判定してくれます(CHARacter DETectionで、chardet)。完璧ではないので、本来はあんまりするべきではなさそうですが、どうしても文字コードが特定できない場合に、このライブラリが使えます。
◯インストール
普通にpipで入ります。
pip install chardet
◯コマンドラインからchardetを使う
以下のような感じで使うことができます。
chardetect file1 file2
ファイルは一つでもいいですが、複数ファイルを渡すこともできます。
実際に、utf-8で書かれたREADME.mdファイルで試してみます。
> chardetect README.md README.md: utf-8 with confidence 0.99
あってますね(笑)。結果はこんなふうに、confidenceも含めて、どの文字コードと識別したかまで返してくれます。
◯pythonのコードの中から使う
当然のごとく、pythonコードからも使うことができます。
import chardet with open("README.md", "rb") as f: print(chardet.detect(f.read()))
これを実行すると、以下のような出力が帰ってきます。dictで取得できるみたいですね。
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
たぶんこの手の話はwebページのクローリングとかでよく使うそうだなと思うんですが、最近はrequestsにもそういうのがあるとはいえ、必要になったら使おうかなと思います。