St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

chardetを使って文字コードを判定する

こんにちは。

今日は文字コードの判定について書きます。

文字コードの識別

もう基本UTF-8にしろよって感じなんですけど、たまにアップロードされたファイルの文字コードがなにか知りたいとかっていうシーンがあります。

今回はそれをPythonでやろうというものなのですが、そもそも文字コードを完璧に識別することはできません。完璧にやろうとすると、どこかから識別してもらうしか方法は基本的にありません。


しかし、バイトシーケンスのエンコーディングを識別するために、何もできないかというとそうでもありません。


バイトストリームが人の読むプレーンテキストだと仮定すると、言語にもルールがあるので、ヒューリスティックな方法や統計手法を使ってエンコーディングを探し出すことはできます。たとえば、ある特定のバイト値が結構あれば、このエンコーディングだな、みたいな感じです。


PyPIから提供されているchardetというパッケージは、対応している30種類のエンコーディングをそんな感じで判定してくれます(CHARacter DETectionで、chardet)。完璧ではないので、本来はあんまりするべきではなさそうですが、どうしても文字コードが特定できない場合に、このライブラリが使えます。

◯chardetを使って識別できるエンコーディング

本家のサイトの一番最初にかかれています。

◯インストール

普通にpipで入ります。

pip install chardet

◯chardetを使う方法

chardetを使うには、次の2つの方法があります。

それぞれ使い方を見ていきます。

コマンドラインから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にもそういうのがあるとはいえ、必要になったら使おうかなと思います。