【Python】chardetをインストールして文字コードを判定する

【Python】chardetをインストールして文字コードを判定する プログラミング

「すべてのファイルが、UTF-8で保存される世界なら・・・」
このような世界なら、文字コードの判定なんて必要ありません。

でも、日本語を扱う以上はそんな世界を諦めましょう。
当面は、まだまだShift-JISが頑張るはずです。

したがって、Pythonでも文字コードの判定が必要になります。
その際に役に立つのが、chardetライブラリです。

本記事の内容

  • chardetとは?
  • chardetのシステム要件
  • chardetのインストール
  • chardetの動作確認

それでは、上記に沿って解説していきます。

chardetとは?

chardetとは、文字コードの自動検出を行うPythonライブラリです。
オープンソースとして開発されています。

自動検出が可能な文字コードは、以下。

  • ASCII, UTF-8, UTF-16 (2 variants), UTF-32 (4 variants)
  • Big5, GB2312, EUC-TW, HZ-GB-2312, ISO-2022-CN (Traditional and Simplified Chinese)
  • EUC-JP, SHIFT_JIS, CP932, ISO-2022-JP (Japanese)
  • EUC-KR, ISO-2022-KR, Johab (Korean)
  • KOI8-R, MacCyrillic, IBM855, IBM866, ISO-8859-5, windows-1251 (Cyrillic)
  • ISO-8859-5, windows-1251 (Bulgarian)
  • ISO-8859-1, windows-1252 (Western European languages)
  • ISO-8859-7, windows-1253 (Greek)
  • ISO-8859-8, windows-1255 (Visual and Logical Hebrew)
  • TIS-620 (Thai)

そして、chardetの文字コード検出の精度はFireFoxと同レベルと言えます。
なぜなら、chardetはMozillaの自動検出コードを移植しているからです。

ただ、文字コードの検出をchardet任せにするのは違うようです。
明示的に指定されている場合は、そちらを優先することも必要になります。

例えば、以下のような明示的なケースです。

  • HTTPプロトコルにおけるContent-Typeヘッダーのcharset
  • HTML文書における<meta http-equiv=”content-type”>
  • XML文書における<?xml version=”1.0″ encoding=”●●●” ?>

そうは言っても、FifeFoxと同じレベルで検出できるなら、そっちに任せたいと感じます。
それは、各自で判断してください。

また、chardetには二つの利用パターンがあります。

  • コマンドラインツール
  • Python API

それぞれを以下で説明します。

コマンドラインツール

簡単に言うと、nkfコマンドです。
nkfコマンドが使えれば、それほど意味がないのかもしれません。

でも、多言語対応とその精度を考えると、nkfコマンドより使える可能性はあります。
nkfコマンドに不満がある場合は、chardetをコマンドラインツールとして使うのはアリですね。

Python API

やはり、断然こちらの方がchardetを使うケースは多いでしょう。
文字コードを判定して、何かしら次の処理に進みます。

一般的には、ファイルの読み込み時に利用するでしょうね。
ファイルの文字コードに応じて、処理を分岐させるなど。

まとめ

chardetには、FireFoxレベルの文字コード検出が期待できます。
だからかどうかわかりませんが、他ライブラリから利用(依存)されているのを見かけます。

以上、chardetに関する説明でした。
次に、chardetのシステム要件を確認します。

chardetのシステム要件

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

Pythonが動けば、OSは問わないようです。
ただ、サポート対象となるPythonのバージョンには注意が必要となります。

Python 3.6以降のみサポート対象となっています。
バージョンの範囲が狭くて、厳しいと思う方もいるかもしれません。

でも、これは以下のPythonの公式開発サイクルに準じているだけです。

バージョンリリース日サポート期限
3.62016年12月23日2021年12月
3.72018年6月27日2023年6月
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月

そのため、chardetのサポート対象範囲は全然厳しくもありません。
むしろ、理想的と言えます。
セキュリティやパフォーマンスを考えたら、公式開発サイクルを守ることがベターです。

以上、chardetのシステム要件の説明でした。
次は、chardetのインストールに関してです。

chardetのインストール

最初に、現状のインストール済みパッケージを確認しておきます。

>pip list
Package    Version
---------- -------
pip        21.0.1
setuptools 54.2.0

次にするべきことは、pip自体の更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip

では、chardetのインストールです。
chardetのインストールは、以下のコマンドとなります。

pip install chardet

インストールは、一瞬で終わります。
では、どんなパッケージがインストールされたのかを確認しましょう。

>pip list
Package    Version
---------- -------
chardet    4.0.0
pip        21.0.1
setuptools 54.2.0

chardetだけですね。
依存関係のあるパッケージはないということです。

依存関係と言うと、chardetが他のライブラリなどから依存されるケースが多いです。
それだけ文字コードの判別では、優秀なライブラリと言えます。

以上、chardetのインストールの説明でした。
最後は、chardetの動作確認を行います。

chardetの動作確認

chardetには、以下の二つの利用パターンがありました。

  • コマンドラインツール
  • Python API

それぞれのパターンを確認しましょう。

コマンドラインツール

バージョンは、以下で確認可能です。

>chardetect --version
chardetect 4.0.0

次は、nkfコマンドのように利用してみましょう。
まず、文字コードUTF-8のファイルを用意します。

test.txt(UTF-8)

テスト

文字コードの自動検出を実行します。

>chardetect text.txt
text.txt: utf-8 with confidence 0.87625

上手く検出できたようです。
信頼性が数字で出るのは、nkfとは違いますね。

Python API

HOYA株式会社のWebサイトの文字コードを検出しています。

import urllib.request
import chardet

rawdata = urllib.request.urlopen("https://www.hoya.co.jp/").read()
print(chardet.detect(rawdata))

上記を実行した結果は、以下。

{'encoding': 'SHIFT_JIS', 'confidence': 0.99, 'language': 'Japanese'}

大企業であるHOYAのwebサイトは、SHIFT_JISという判定が出ています。
念のため、次の情報も確認しました。

  • HTTPプロトコルにおけるContent-Typeヘッダーのcharset
  • HTML文書における<meta http-equiv=”content-type”>

HTTPプロトコルにおけるContent-Typeヘッダーのcharset

未設定です。

HTML文書における<meta http-equiv=”content-type”>

Shift_JISが設定されています。

上記より、HOYA株式会社のWebサイトはShift_JISだと断定できます。
そして、chardetが問題なく動作していると言えます。

まとめ

コマンドラインツールとPython APIの両方において、 chardetの動作確認を行いました。
使い方次第では、コマンドラインツールもそれなりに需要はありそうです。

そうは言っても、Python APIとしての利用の方が多くなるでしょう。
上記で行ったように、スクレイピングする場合にchardetは効果を発揮しそうです。

すべてのWebサイトがUTF-8というわけではありません。
HOYAのような大企業であっても、 Shift_JISであるというが日本の現状かもしれません。

そうだとしたら、不特定多数のWebサイトをスクレイピングする際にはchardetが活躍しそうです。

タイトルとURLをコピーしました