Python で encoding の一覧を取得する方法とコード例(標準エンコーディングの表から一覧を取得)

Python で 'utf-8''shift-jis' といった『encodingエンコーディング の一覧』を取得する方法です。

エンコーディングの一覧は、Python 公式マニュアルの『ライブラリーリファレンス』⇒『codecs』⇒『標準エンコーディング』に、表として載っていました。

一覧の取得手順です。

  1. Python 公式マニュアルのページ『codecs — codec レジストリと基底クラス』を開く。
  2. 標準エンコーディング (Standard Encodings)』にある表をコピーする。
  3. 『Codec (Encoding)』の列を抽出して、ファイルに保存する。

これで、文字列の encodeエンコードdecodeデコード に使用できる『エンコーディングの一覧』を取得することができました。

Web ブラウザからの手作業でも作れましたし、表を BeautifulSoup で読み込んで一覧に加工することもできました(Python コード例を紹介します)。

この『エンコーディングの一覧』ですが、エンコーディングの判定を総当たりで行うときに、とても有用ゆうようでした。

たとえば HTML のエンコーディングですが、ごくまれに、BeautifulSoup(), lxml.html.fromstring(), cchardet.detect() などによる自動判定が失敗しました。

そういったときの最終手段として、HTML のエンコーディングを総当たりで判定するのが有効でした。

Python マニュアルにある『標準エンコーディング (Standard Encodings)』の表から作成した『エンコーディングの一覧』は、とても役に立ちました。

失敗した方法

逆に、『エンコーディングの一覧』をうまく取得できなかった方法と、その理由です。

encodingsエンコーディングス モジュールの『エイリアス辞書 encodings.aliases.aliases』を使った方法
⇒ あくまでエイリアス(別名)の辞書でしたので、エイリアスが無いタイプのエンコーディングが載っていませんでした。なので、完全な一覧は作れませんでした。また、テキスト表現用ではない『データ圧縮用』のエンコーディングなどが辞書に混ざっていて、自分の目的では使えませんでした。
testテスト モジュールの中にあった『test_codecs.all_unicode_encodings』のリストを使った方法
⇒ 試してみたところ、このリストは、すべてのエンコーディングを網羅したリストではありませんでした。なので、完全な一覧は作れませんでした。

ほかにも、Python のインストールフォルダを全文検索した結果、自分が探した限りでは、『エンコーディングの一覧』を提供しているモジュールはありませんでした (Python 3.8.1)。

そうして、最終的に自分にとって最良だったのが、『標準エンコーディング (Standard Encodings)』の表を参照する方法でした。

実際のところ、この表だけで『テキスト用のエンコーディング一覧を取得する』という目的を果たすことができました。

encoding の一覧は『標準エンコーディング』の表から取得できた

自分が探した中では、『標準エンコーディング (Standard Encodings)』の表が、一番広くエンコーディングの種類を網羅もうらしていました。

そしてさらに、用途ごとにエンコーディングの表が分かれていたので、扱いやすかったです。

テキスト表現用のエンコーディングと、その他の用途のエンコーディング(Python 特有のエンコーディングなど)が、区別されて載っていました。

表は、Web ブラウザ上でコピーして、手作業で取得するのが一番簡単でした。

いったん Excel などに貼り付けてから、Codec の列だけをコピーして、テキストエディタに貼り付けます。

最後に、csv 形式か json 形式に加工して保存します。

これで、必要な時に『エンコーディングの一覧』が使えるようになりました。

Python 標準の csv モジュールや json モジュールで読み込むことで、いつでも Python リストや辞書にすることができました。

そのほかに、BeautifulSoupビューティフルスープ で表を読み込んで、『エンコーディングの一覧』を作るコードも書きました。

その Python コード例を紹介します。

BeautifulSoup で『エンコーディングの一覧』を取得する

BeautifulSoup で『エンコーディングの一覧』を取得したときの手順です。

  1. Windows 用の Python ヘルプファイル (.chm) を取得する。
  2. Windows が持っている HTML Help 実行プログラム (hh.exe) で、.chm ファイル ⇒ .html ファイル群に展開する。
  3. library/codecs.html を BeautifulSoup で読み込んで、encoding の一覧辞書を作る。
  4. encoding の一覧辞書を json 形式で保存する。
  5. 一覧を使うときは、json.load() で読み込んで使う。

ところで、『Python ヘルプファイル (.chm)』を使う代わりに、Python 公式マニュアルの html を取得して、BeautifulSoup で読み込む方法でも良いと思います。

Web からでもローカルからでもいいので、『codecs — codec レジストリと基底クラス (library/codecs.html)』の html を用意します。

あとは、BeautifulSoup で『標準エンコーディング』の表を読み込むだけです。

自分は、Python と一緒にインストールされた『Python ヘルプファイル(例:"***\Python\Doc\python381.chm")』を活用したいと思ったので、そこから html を取得するアプローチを採用しました。

ヘルプファイルの取得方法と .html への変換方法の解説です。

Python ヘルプファイル (.chm) の取得方法

Python のインストールフォルダから取得する方法

Windows 10 の場合です。

『Python のインストールフォルダ』⇒『Doc フォルダ』の中に『python381.chm』という .chm ファイルがありました(ファイル名は Python のバージョンによって変わりました)。

この方法は、ローカルファイルだけで『エンコーディングの一覧』が作れたところが良かったです。

Web アクセスは不要でした。

Python の公式サイトから取得する方法

Python マニュアルの .chm ファイルは、Python の公式サイトで、Python のバージョンごとに公開されていました。

ファイルの場所です。

https://www.python.org/』⇒『Downloads (All releases)』⇒『Looking for a specific release?』⇒『各 Release version にある Download リンク』を開きます。

その中にある『Windows help fileウィンドウズ ヘルプ ファイル』というリンクに、.chm ファイルがありました。

この方法を使うと、過去の Python バージョンに対応した『エンコーディングの一覧』を作ることができました。

Python の公式マニュアルサイトでは、現在サポート中の新しいバージョンしか、ヘルプが公開されていませんでした。

しかし、この方法なら、過去の Python バージョンのヘルプを取得することができました。

(古い Python バージョンについては 『Windows help fileウィンドウズ ヘルプ ファイル』が無いケースもありました。)

hh.exe で .chm から .html に変換する方法

『hh.exe』は、Windows で .chm ファイルを開くときに使われるプログラムとのことでした。

Windows 10 の場合は、『"C:\Windows\hh.exe"』にありました。

HTML Help Executable Program (hh.exe) のマニュアルの場所です。

About the HTML Help Executable Program | Microsoft Docs

この hh.exe の機能の中に、.chm から .html を取り出す機能がありました。

decompileデコンパイル という機能です。

To decompile a compiled help file from the command line | Microsoft Docs

.chm ⇒ .html 変換のコマンドラインの構文です。

hh.exe -decompile folder chm

これを、Python から subprocess.run() を使って実行しました。

Python マニュアル
サブプロセス ドット ラン
subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

.chm から取り出した .html ファイル群は、一時フォルダを用意して、そこに保存しました。

Python の tempfile モジュールにある tempfile.TemporaryDirectory() を使うと、with 文の中でだけ使えるフォルダが作れました。

Python マニュアル
テンプファイル ドット テンポラリー ディレクトリ
tempfile.TemporaryDirectory(suffix=None, prefix=None, dir=None)

引数ひきすうの dir にフォルダを指定したら、その中に『ランダムな名前の一時フォルダ』を作ってくれました。

そして、with 文を抜けると、自動でフォルダを削除してくれました。

とても便利でした。

コード例

標準エンコーディング (Standard Encodings)』の表から『エンコーディングの一覧』を取得したときの Python コード例です。

Python のインストールフォルダにあった『ヘルプファイル (python381.chm)』から、エンコーディングを取得しました。

.chm ファイルを .html ファイルに変換してから、BeautifulSoup で読み込み、『エンコーディングの一覧』を取得しました。

取得結果は json ファイルに保存して、以降は、ほかの Python コードから簡単に使えるようにしました。

"""get_encodings_from_html.py"""

from pathlib import Path
import tempfile
import subprocess
import re
import codecs
import traceback
import json
from pprint import pprint
from bs4 import BeautifulSoup


print('Start')

print('\n(1/11) chm -> html 変換に使用する実行ファイル hh.exe を指定')
hh_exe = r'C:\Windows\hh.exe'
print(hh_exe)


print('\n(2/11) Python の chm ファイルを指定')
python_chm = r'*****\python381.chm'
print(python_chm)


print('\n(3/11)『一時フォルダ』の作成場所を決める')
print('(とりあえず自身の .py ファイルと同じフォルダを使用しました)')
print(f'__file__: {__file__}')
py_dir = Path(__file__).parent
print(f'py_dir: {py_dir}')

# tempfile モジュールで一時的なフォルダを作成
with tempfile.TemporaryDirectory(dir=py_dir) as temp_dir:
    print(f'temp_dir: {temp_dir} (一時フォルダ)')
    print('\n【TemporaryDirectory() の with 文開始】')


    print('\n(4/11) chm -> html 変換の『コマンドリスト』を作成')
    cmd = (hh_exe, '-decompile', temp_dir, python_chm)
    pprint(cmd) # pprint() は、リストや辞書を見やすく改行して表示してくれる関数。


    print('\n(5/11) chm を html に変換して『一時フォルダ』に保存')
    _cp = subprocess.run(cmd)
    # _cp: CompletedProcess の略。
    # 先頭のアンダースコア _ は『変数を使用しなかった』の意味。


    print("\n(6/11) 'library/codecs.html' のファイルパスを作成")
    print('(この html に『Standard Encodings』の一覧がありました)')
    codecs_html = Path(temp_dir).joinpath(r'library/codecs.html')
    print(codecs_html)


    print('\n(7/11) html を開いて BeautifulSoup で解析')
    with codecs_html.open('rb') as f:
        soup = BeautifulSoup(f.read(), 'html.parser')


    print('\n(8/11)『Standard Encodings』のテーブルを取得')
    # テーブルを取得する関数を定義
    def get_table(tag_id):
        # CSS セレクタで table を特定
        table = soup.select(f'#{tag_id} > table')[0]
        head = []
        for th in table.select('thead > tr')[0].find_all('th'):
            head.append(th.text)

        # (デバッグ) ヘッダの列は 1 つ以上存在するはず
        assert len(head) >= 1

        body = []
        
        for tr in table.select('tbody')[0].find_all('tr'):
            columns = []
            for td in tr.find_all('td'):
                # 注釈のアンカータグ a を除去
                # (注釈の class 属性には、
                # .footnote-reference と
                # .brackets があったので、それを利用。)
                for a in td.select('a.footnote-reference.brackets'):
                    print(f"タグ除去: 注釈 {a.name} {a.attrs} '{a.text}'")
                    a.extract()

                # "New in version X.X." のタグを削除
                for div in td.select('div.versionadded'):
                    print(f"タグ除去: {div.name} {div.attrs} '{div.text.strip()}'")
                    div.extract()

                # テキストを取得 & 先頭と末尾の空白文字類を除去
                columns.append(td.text.strip())

            # (デバッグ) 列は 1 つ以上存在するはず
            assert len(head) >= 1

            if columns:
                body.append(columns)
        return {'head': head, 'body': body}

    # 関数を呼び出して、テーブルの内容を取得。
    standard_encodings = get_table(tag_id='standard-encodings')


    print('\n(9/11) Standard Encodings のリストから'\
        ' encoding と languages の辞書を作る')

    encodings = {}
    enc_lookup_set = set() # 重複を除外するための集合

    for columns in standard_encodings['body']:
        # columns:
        # [0]Codec (encoding) [1]Aliases (別名) [2]Languages (言語)

        # エンコーディングを取得
        enc = columns[0]

        # 言語のリストを取得
        langs = []
        for lang in columns[2].split(','):
            # 先頭と末尾の空白文字類を除去
            lang = lang.strip()

            # 文字列の中の空白文字類を半角スペースに置換
            lang = re.sub(r'[\r\n\t]+', ' ', lang)

            # 言語のリストに追加
            langs.append(lang)

        # もし『同じエンコーディングを指しているもの』があったら除外する
        try:
            enc_lookup = codecs.lookup(enc)
        except LookupError as e:
            # Standard Encodings の表 (table) にミスが無い限り、
            # ここは実行されないはず。
            print(traceback.format_exception_only(type(e), e)[0].rstrip())
        else:
            if enc in enc_lookup_set:
                # ここも、Standard Encodings の表 (table) にミスが無い限り、
                # 実行されないはず。
                print(f'除外: {enc} は {enc_lookup.name} と同じ')
                continue
            else:
                encodings[enc] = langs
                enc_lookup_set.add(enc_lookup.name)

    print('\n【TemporaryDirectory() の with 文終了】')
    print('(一時フォルダが削除されます)')


print('\n(10/11) 『エンコーディングの一覧』を json として保存')
# 保存ファイルパスを決める
enc_json = Path(__file__).with_name('data_encodings.json')
print(enc_json)

# 辞書を json として保存する
with enc_json.open('w') as f:
    json.dump(encodings, f, indent=2)

# (デバッグ) 保存した json を読み込む
with enc_json.open('r') as f:
    enc_json_datas = json.load(f)

# (デバッグ) json から読み込んだデータは、元のデータと一致するはず。
assert enc_json_datas == encodings


print('\n(11/11) エンコーディングの一覧を『language の辞書』として保存')
# encodings を『言語 (language)』の辞書としてまとめ直す
languages = {}
for (enc, langs) in encodings.items():
    for lang in langs:
        if lang in languages:
            languages[lang].append(enc)
        else:
            languages[lang] = [enc]

# 保存ファイルパスを決める
lang_json = Path(__file__).with_name('data_languages.json')
print(lang_json)

# 辞書を json として保存する
with lang_json.open('w') as f:
    json.dump(languages, f, indent=2)

# (デバッグ) 保存した json を読み込む
with lang_json.open('r') as f:
    lang_json_datas = json.load(f)

# (デバッグ) json から読み込んだデータは、元のデータと一致するはず。
assert lang_json_datas == languages

print('\nEnd')


# 以上です。
# これで、テキスト用の『エンコーディング一覧』の
# 取得 & 保存 & 読込ができました。

# 以下は、デバッグのための表示です。

print('\n(デバッグ 1/2) 標準エンコーディング (Standard Encodings) は')
print(f'len(encodings): {len(encodings)} 種類')


print('\n(デバッグ 2/2) エンコードに使ってみる')
text = '012abcあ'
for (enc, langs) in encodings.items():
    try:
        text.encode(enc)
    except UnicodeEncodeError as e:
        print(f"'{text}'.encode('{enc}') -> ({e.__class__.__name__})")
    else:
        print(f"'{text}'.encode('{enc}') -> {text.encode(enc)}")

print('\n以上です。')

実行結果

コードを実行したときの、コマンドプロンプトの表示です。

Start

(1/11) chm -> html 変換に使用する実行ファイル hh.exe を指定
C:\Windows\hh.exe

(2/11) Python の chm ファイルを指定
*****\python381.chm

(3/11)『一時フォルダ』の作成場所を決める
(とりあえず自身の .py ファイルと同じフォルダを使用しました)
__file__: *****/test_code/enc_list/get_encodings_from_html.py
py_dir: *****\test_code\enc_list
temp_dir: *****\test_code\enc_list\tmpdmsflu28 (一時フォルダ)

【TemporaryDirectory() の with 文開始】

(4/11) chm -> html 変換の『コマンドリスト』を作成
('C:\\Windows\\hh.exe',
 '-decompile',
 '*****\\test_code\\enc_list\\tmpdmsflu28',
 '*****\\python381.chm')

(5/11) chm を html に変換して『一時フォルダ』に保存

(6/11) 'library/codecs.html' のファイルパスを作成
(この html に『Standard Encodings』の一覧がありました)
*****\enc_list\tmpdmsflu28\library\codecs.html

(7/11) html を開いて BeautifulSoup で解析

(8/11)『Standard Encodings』のテーブルを取得
タグ除去: div {'class': ['versionadded']} 'New in version 3.4.'
タグ除去: div {'class': ['versionadded']} 'New in version 3.4.'
タグ除去: div {'class': ['versionadded']} 'New in version 3.5.'
タグ除去: div {'class': ['versionadded']} 'New in version 3.5.'

(9/11) Standard Encodings のリストから encoding と languages の辞書を作る

【TemporaryDirectory() の with 文終了】
(一時フォルダが削除されます)

(10/11) 『エンコーディングの一覧』を json として保存
*****\test_code\enc_list\data_encodings.json

(11/11) エンコーディングの一覧を『language の辞書』として保存
*****\test_code\enc_list\data_languages.json

End

(デバッグ 1/2) 標準エンコーディング (Standard Encodings) は
len(encodings): 97 種類

(デバッグ 2/2) エンコードに使ってみる
'012abcあ'.encode('ascii') -> (UnicodeEncodeError)
'012abcあ'.encode('big5') -> b'012abc\xc6\xa6'
'012abcあ'.encode('big5hkscs') -> b'012abc\xc6\xe8'
'012abcあ'.encode('cp037') -> (UnicodeEncodeError)
'012abcあ'.encode('cp273') -> (UnicodeEncodeError)
'012abcあ'.encode('cp424') -> (UnicodeEncodeError)
'012abcあ'.encode('cp437') -> (UnicodeEncodeError)
'012abcあ'.encode('cp500') -> (UnicodeEncodeError)
'012abcあ'.encode('cp720') -> (UnicodeEncodeError)
'012abcあ'.encode('cp737') -> (UnicodeEncodeError)
'012abcあ'.encode('cp775') -> (UnicodeEncodeError)
'012abcあ'.encode('cp850') -> (UnicodeEncodeError)
'012abcあ'.encode('cp852') -> (UnicodeEncodeError)
'012abcあ'.encode('cp855') -> (UnicodeEncodeError)
'012abcあ'.encode('cp856') -> (UnicodeEncodeError)
'012abcあ'.encode('cp857') -> (UnicodeEncodeError)
'012abcあ'.encode('cp858') -> (UnicodeEncodeError)
'012abcあ'.encode('cp860') -> (UnicodeEncodeError)
'012abcあ'.encode('cp861') -> (UnicodeEncodeError)
'012abcあ'.encode('cp862') -> (UnicodeEncodeError)
'012abcあ'.encode('cp863') -> (UnicodeEncodeError)
'012abcあ'.encode('cp864') -> (UnicodeEncodeError)
'012abcあ'.encode('cp865') -> (UnicodeEncodeError)
'012abcあ'.encode('cp866') -> (UnicodeEncodeError)
'012abcあ'.encode('cp869') -> (UnicodeEncodeError)
'012abcあ'.encode('cp874') -> (UnicodeEncodeError)
'012abcあ'.encode('cp875') -> (UnicodeEncodeError)
'012abcあ'.encode('cp932') -> b'012abc\x82\xa0'
'012abcあ'.encode('cp949') -> b'012abc\xaa\xa2'
'012abcあ'.encode('cp950') -> b'012abc\xc6\xa6'
'012abcあ'.encode('cp1006') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1026') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1125') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1140') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1250') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1251') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1252') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1253') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1254') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1255') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1256') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1257') -> (UnicodeEncodeError)
'012abcあ'.encode('cp1258') -> (UnicodeEncodeError)
'012abcあ'.encode('euc_jp') -> b'012abc\xa4\xa2'
'012abcあ'.encode('euc_jis_2004') -> b'012abc\xa4\xa2'
'012abcあ'.encode('euc_jisx0213') -> b'012abc\xa4\xa2'
'012abcあ'.encode('euc_kr') -> b'012abc\xaa\xa2'
'012abcあ'.encode('gb2312') -> b'012abc\xa4\xa2'
'012abcあ'.encode('gbk') -> b'012abc\xa4\xa2'
'012abcあ'.encode('gb18030') -> b'012abc\xa4\xa2'
'012abcあ'.encode('hz') -> b'012abc~{$"~}'
'012abcあ'.encode('iso2022_jp') -> b'012abc\x1b$B$"\x1b(B'
'012abcあ'.encode('iso2022_jp_1') -> b'012abc\x1b$B$"\x1b(B'
'012abcあ'.encode('iso2022_jp_2') -> b'012abc\x1b$B$"\x1b(B'
'012abcあ'.encode('iso2022_jp_2004') -> b'012abc\x1b$B$"\x1b(B'
'012abcあ'.encode('iso2022_jp_3') -> b'012abc\x1b$B$"\x1b(B'
'012abcあ'.encode('iso2022_jp_ext') -> b'012abc\x1b$B$"\x1b(B'
'012abcあ'.encode('iso2022_kr') -> b'012abc\x1b$)C\x0e*"\x0f'
'012abcあ'.encode('latin_1') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_2') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_3') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_4') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_5') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_6') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_7') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_8') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_9') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_10') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_11') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_13') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_14') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_15') -> (UnicodeEncodeError)
'012abcあ'.encode('iso8859_16') -> (UnicodeEncodeError)
'012abcあ'.encode('johab') -> b'012abc\xdd\xa2'
'012abcあ'.encode('koi8_r') -> (UnicodeEncodeError)
'012abcあ'.encode('koi8_t') -> (UnicodeEncodeError)
'012abcあ'.encode('koi8_u') -> (UnicodeEncodeError)
'012abcあ'.encode('kz1048') -> (UnicodeEncodeError)
'012abcあ'.encode('mac_cyrillic') -> (UnicodeEncodeError)
'012abcあ'.encode('mac_greek') -> (UnicodeEncodeError)
'012abcあ'.encode('mac_iceland') -> (UnicodeEncodeError)
'012abcあ'.encode('mac_latin2') -> (UnicodeEncodeError)
'012abcあ'.encode('mac_roman') -> (UnicodeEncodeError)
'012abcあ'.encode('mac_turkish') -> (UnicodeEncodeError)
'012abcあ'.encode('ptcp154') -> (UnicodeEncodeError)
'012abcあ'.encode('shift_jis') -> b'012abc\x82\xa0'
'012abcあ'.encode('shift_jis_2004') -> b'012abc\x82\xa0'
'012abcあ'.encode('shift_jisx0213') -> b'012abc\x82\xa0'
'012abcあ'.encode('utf_32') -> b'\xff\xfe\x00\x000\x00\x00\x001\x00\x00\x002\x00\x00\x00a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00B0\x00\x00'
'012abcあ'.encode('utf_32_be') -> b'\x00\x00\x000\x00\x00\x001\x00\x00\x002\x00\x00\x00a\x00\x00\x00b\x00\x00\x00c\x00\x000B'
'012abcあ'.encode('utf_32_le') -> b'0\x00\x00\x001\x00\x00\x002\x00\x00\x00a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00B0\x00\x00'
'012abcあ'.encode('utf_16') -> b'\xff\xfe0\x001\x002\x00a\x00b\x00c\x00B0'
'012abcあ'.encode('utf_16_be') -> b'\x000\x001\x002\x00a\x00b\x00c0B'
'012abcあ'.encode('utf_16_le') -> b'0\x001\x002\x00a\x00b\x00c\x00B0'
'012abcあ'.encode('utf_7') -> b'012abc+MEI-'
'012abcあ'.encode('utf_8') -> b'012abc\xe3\x81\x82'
'012abcあ'.encode('utf_8_sig') -> b'\xef\xbb\xbf012abc\xe3\x81\x82'

以上です。

エンコーディングの一覧

json ファイルとして保存した『エンコーディング一覧』の辞書です。

json ファイルは、Python 標準の json.load() で読み込むことで、いつでも Python 辞書にすることができました。

ファイル名:data_encodings.json

{
  "ascii": [
    "English"
  ],
  "big5": [
    "Traditional Chinese"
  ],
  "big5hkscs": [
    "Traditional Chinese"
  ],
  "cp037": [
    "English"
  ],
  "cp273": [
    "German"
  ],
  "cp424": [
    "Hebrew"
  ],
  "cp437": [
    "English"
  ],
  "cp500": [
    "Western Europe"
  ],
  "cp720": [
    "Arabic"
  ],
  "cp737": [
    "Greek"
  ],
  "cp775": [
    "Baltic languages"
  ],
  "cp850": [
    "Western Europe"
  ],
  "cp852": [
    "Central and Eastern Europe"
  ],
  "cp855": [
    "Bulgarian",
    "Byelorussian",
    "Macedonian",
    "Russian",
    "Serbian"
  ],
  "cp856": [
    "Hebrew"
  ],
  "cp857": [
    "Turkish"
  ],
  "cp858": [
    "Western Europe"
  ],
  "cp860": [
    "Portuguese"
  ],
  "cp861": [
    "Icelandic"
  ],
  "cp862": [
    "Hebrew"
  ],
  "cp863": [
    "Canadian"
  ],
  "cp864": [
    "Arabic"
  ],
  "cp865": [
    "Danish",
    "Norwegian"
  ],
  "cp866": [
    "Russian"
  ],
  "cp869": [
    "Greek"
  ],
  "cp874": [
    "Thai"
  ],
  "cp875": [
    "Greek"
  ],
  "cp932": [
    "Japanese"
  ],
  "cp949": [
    "Korean"
  ],
  "cp950": [
    "Traditional Chinese"
  ],
  "cp1006": [
    "Urdu"
  ],
  "cp1026": [
    "Turkish"
  ],
  "cp1125": [
    "Ukrainian"
  ],
  "cp1140": [
    "Western Europe"
  ],
  "cp1250": [
    "Central and Eastern Europe"
  ],
  "cp1251": [
    "Bulgarian",
    "Byelorussian",
    "Macedonian",
    "Russian",
    "Serbian"
  ],
  "cp1252": [
    "Western Europe"
  ],
  "cp1253": [
    "Greek"
  ],
  "cp1254": [
    "Turkish"
  ],
  "cp1255": [
    "Hebrew"
  ],
  "cp1256": [
    "Arabic"
  ],
  "cp1257": [
    "Baltic languages"
  ],
  "cp1258": [
    "Vietnamese"
  ],
  "euc_jp": [
    "Japanese"
  ],
  "euc_jis_2004": [
    "Japanese"
  ],
  "euc_jisx0213": [
    "Japanese"
  ],
  "euc_kr": [
    "Korean"
  ],
  "gb2312": [
    "Simplified Chinese"
  ],
  "gbk": [
    "Unified Chinese"
  ],
  "gb18030": [
    "Unified Chinese"
  ],
  "hz": [
    "Simplified Chinese"
  ],
  "iso2022_jp": [
    "Japanese"
  ],
  "iso2022_jp_1": [
    "Japanese"
  ],
  "iso2022_jp_2": [
    "Japanese",
    "Korean",
    "Simplified Chinese",
    "Western Europe",
    "Greek"
  ],
  "iso2022_jp_2004": [
    "Japanese"
  ],
  "iso2022_jp_3": [
    "Japanese"
  ],
  "iso2022_jp_ext": [
    "Japanese"
  ],
  "iso2022_kr": [
    "Korean"
  ],
  "latin_1": [
    "Western Europe"
  ],
  "iso8859_2": [
    "Central and Eastern Europe"
  ],
  "iso8859_3": [
    "Esperanto",
    "Maltese"
  ],
  "iso8859_4": [
    "Baltic languages"
  ],
  "iso8859_5": [
    "Bulgarian",
    "Byelorussian",
    "Macedonian",
    "Russian",
    "Serbian"
  ],
  "iso8859_6": [
    "Arabic"
  ],
  "iso8859_7": [
    "Greek"
  ],
  "iso8859_8": [
    "Hebrew"
  ],
  "iso8859_9": [
    "Turkish"
  ],
  "iso8859_10": [
    "Nordic languages"
  ],
  "iso8859_11": [
    "Thai languages"
  ],
  "iso8859_13": [
    "Baltic languages"
  ],
  "iso8859_14": [
    "Celtic languages"
  ],
  "iso8859_15": [
    "Western Europe"
  ],
  "iso8859_16": [
    "South-Eastern Europe"
  ],
  "johab": [
    "Korean"
  ],
  "koi8_r": [
    "Russian"
  ],
  "koi8_t": [
    "Tajik"
  ],
  "koi8_u": [
    "Ukrainian"
  ],
  "kz1048": [
    "Kazakh"
  ],
  "mac_cyrillic": [
    "Bulgarian",
    "Byelorussian",
    "Macedonian",
    "Russian",
    "Serbian"
  ],
  "mac_greek": [
    "Greek"
  ],
  "mac_iceland": [
    "Icelandic"
  ],
  "mac_latin2": [
    "Central and Eastern Europe"
  ],
  "mac_roman": [
    "Western Europe"
  ],
  "mac_turkish": [
    "Turkish"
  ],
  "ptcp154": [
    "Kazakh"
  ],
  "shift_jis": [
    "Japanese"
  ],
  "shift_jis_2004": [
    "Japanese"
  ],
  "shift_jisx0213": [
    "Japanese"
  ],
  "utf_32": [
    "all languages"
  ],
  "utf_32_be": [
    "all languages"
  ],
  "utf_32_le": [
    "all languages"
  ],
  "utf_16": [
    "all languages"
  ],
  "utf_16_be": [
    "all languages"
  ],
  "utf_16_le": [
    "all languages"
  ],
  "utf_7": [
    "all languages"
  ],
  "utf_8": [
    "all languages"
  ],
  "utf_8_sig": [
    "all languages"
  ]
}

言語ごとの一覧

言語 (language) ごとにまとめ直した『エンコーディング一覧』の辞書です。

エンコーディングを総当たりで判定するときに、『言語固有のエンコーディング』を試してから『all languages のエンコーディング』を試してみようと考えて作りました。

あらかじめ候補を限定することで、エンコーディングの誤判定を減らせないかと考えたわけであります。

Python 3.8.1 のマニュアルから作成した一覧ですが、それにしても日本語用のエンコーディングが多いですね。

想像ですが、まだ対応していないだけで、ほかの言語にもエンコーディングのこまかい変種はあると思います。

おそらくですが、日本語対応のために、尽力してくださった方々がいらっしゃるのだと思います。ありがとうございます。

ファイル名:data_languages.json

{
  "English": [
    "ascii",
    "cp037",
    "cp437"
  ],
  "Traditional Chinese": [
    "big5",
    "big5hkscs",
    "cp950"
  ],
  "German": [
    "cp273"
  ],
  "Hebrew": [
    "cp424",
    "cp856",
    "cp862",
    "cp1255",
    "iso8859_8"
  ],
  "Western Europe": [
    "cp500",
    "cp850",
    "cp858",
    "cp1140",
    "cp1252",
    "iso2022_jp_2",
    "latin_1",
    "iso8859_15",
    "mac_roman"
  ],
  "Arabic": [
    "cp720",
    "cp864",
    "cp1256",
    "iso8859_6"
  ],
  "Greek": [
    "cp737",
    "cp869",
    "cp875",
    "cp1253",
    "iso2022_jp_2",
    "iso8859_7",
    "mac_greek"
  ],
  "Baltic languages": [
    "cp775",
    "cp1257",
    "iso8859_4",
    "iso8859_13"
  ],
  "Central and Eastern Europe": [
    "cp852",
    "cp1250",
    "iso8859_2",
    "mac_latin2"
  ],
  "Bulgarian": [
    "cp855",
    "cp1251",
    "iso8859_5",
    "mac_cyrillic"
  ],
  "Byelorussian": [
    "cp855",
    "cp1251",
    "iso8859_5",
    "mac_cyrillic"
  ],
  "Macedonian": [
    "cp855",
    "cp1251",
    "iso8859_5",
    "mac_cyrillic"
  ],
  "Russian": [
    "cp855",
    "cp866",
    "cp1251",
    "iso8859_5",
    "koi8_r",
    "mac_cyrillic"
  ],
  "Serbian": [
    "cp855",
    "cp1251",
    "iso8859_5",
    "mac_cyrillic"
  ],
  "Turkish": [
    "cp857",
    "cp1026",
    "cp1254",
    "iso8859_9",
    "mac_turkish"
  ],
  "Portuguese": [
    "cp860"
  ],
  "Icelandic": [
    "cp861",
    "mac_iceland"
  ],
  "Canadian": [
    "cp863"
  ],
  "Danish": [
    "cp865"
  ],
  "Norwegian": [
    "cp865"
  ],
  "Thai": [
    "cp874"
  ],
  "Japanese": [
    "cp932",
    "euc_jp",
    "euc_jis_2004",
    "euc_jisx0213",
    "iso2022_jp",
    "iso2022_jp_1",
    "iso2022_jp_2",
    "iso2022_jp_2004",
    "iso2022_jp_3",
    "iso2022_jp_ext",
    "shift_jis",
    "shift_jis_2004",
    "shift_jisx0213"
  ],
  "Korean": [
    "cp949",
    "euc_kr",
    "iso2022_jp_2",
    "iso2022_kr",
    "johab"
  ],
  "Urdu": [
    "cp1006"
  ],
  "Ukrainian": [
    "cp1125",
    "koi8_u"
  ],
  "Vietnamese": [
    "cp1258"
  ],
  "Simplified Chinese": [
    "gb2312",
    "hz",
    "iso2022_jp_2"
  ],
  "Unified Chinese": [
    "gbk",
    "gb18030"
  ],
  "Esperanto": [
    "iso8859_3"
  ],
  "Maltese": [
    "iso8859_3"
  ],
  "Nordic languages": [
    "iso8859_10"
  ],
  "Thai languages": [
    "iso8859_11"
  ],
  "Celtic languages": [
    "iso8859_14"
  ],
  "South-Eastern Europe": [
    "iso8859_16"
  ],
  "Tajik": [
    "koi8_t"
  ],
  "Kazakh": [
    "kz1048",
    "ptcp154"
  ],
  "all languages": [
    "utf_32",
    "utf_32_be",
    "utf_32_le",
    "utf_16",
    "utf_16_be",
    "utf_16_le",
    "utf_7",
    "utf_8",
    "utf_8_sig"
  ]
}

以上です。

Python テキストの Encoding の一覧は、Python 公式マニュアルの『標準エンコーディング (Standard Encodings)』にある表から取得するのが、簡単で便利でした。

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