文字コード自動判定

文字コードの判別

[23] 文字列であるはずのバイト列からその文字コード (文字符号化) を決定する手法には、決め打ち (例: UTF-8 固定) やメタ情報 (例: charset 引数) の他に、 バイト列自体からの推定があります。

[24] 不確実性を伴うものの、現実には非常に広範囲かつ頻繁に用いられています。

構文知識に基づく文字コードの決定

[25] 内容がある程度限定される場合は、それを前提とした検出手法を採用できます。

[56] HTML などでは詳細な算法が仕様上定められています。

[57] それ以外でも発見的な方法が色々実装されています。 HTML などと違って明確な規定がない分野では実装ごとの違いが大きく、 相互運用性に問題が生じています。

[1] 構文依存の方法により文字コードを決定する

確率的判定

[2] 任意のテキストデータ文字コードの判定には、 文字コードバイト範囲や、 出現文字の頻度・確率の情報が使われています。

[58] 平成時代中頃までの古典的な方法では、 文字符号化によって符号の構造が異なることを利用し、 ある文字コード体系で出現する符号かそうでないかという構造的知識を主に使っていました。 しかしこの方法単独では符号構造が重複する領域で互いの区別が付きづらく、 あまり精度が上げられませんでした。 ただ、実装が容易ではあるので、幅広く用いられましたし、現在でも使われることは珍しくありません。

[59] 例えばシフトJIS日本語EUCは第1バイトに使われるバイト、 第2バイトに使われるバイトの範囲がそれぞれ違っていますので、 その範囲に収まるかによってどちらか判断できることが多いです。 しかし完全に重なる部分もあるため、そのような符号ばかりだと正しく判定できません。

[60] また、半角カタカナを利用すると両者の重なる領域が著しく増えるため、 誤判定が多くなり、頻繁に半角カタカナ文字化けを目にすることになります。 これは半角カタカナが嫌われる大きな要因の1つにもなっていました。

[3] universalchardet は、 MozillaWebページの表示のために開発したものです。 多くのプラットフォームに移植されて使われています。

[4] 次の符号化に対応しています:

utf-8 utf-16be utf-16le iso-2022-cn big5 x-euc-tw gb18030 hz-gb-2312 iso-2022-jp shift_jis euc-jp iso-2022-kr euc-kr iso-8859-5 koi8-r windows-1251 x-mac-cyrillic ibm866 ibm855 iso-8859-7 tis-620 windows-1253 iso-8859-8 windows-1255 windows-1252

[6] データだけで未実装: iso-8859-2 windows-1250

[5] 特に日本キリル文字圏では、複数の文字コードが同程度に広く使われていたために自動判定が重宝されていました。

TLD の利用

[39] >>38 : chardetngTLD と動作モードの関係性

実装

[44] 出現頻度等による実装:

[54] 符号構造のみによる実装:

[76] LV Homepage (in Japanese), , https://web.archive.org/web/20010119052900/http://www.mt.cs.keio.ac.jp/person/narita/lv/index_ja.html

現在の自動選択の方法は簡単なものです. ファイルを先頭から読み込んでいって, 8ビット目が立っている文字があった場合, 『その行』の中で euc-japan で使用される領域のみを使っていれば euc-japan, そうでなければ shift-jis です. つまり,『漢字らしきものを含む最初の一行』で判断しています. 8ビット目が立っている文字が見つからなければ いつまでも自動選択のままの状態が続き, 判断が必要になったときに判断します. shift-jis の片仮名のみを使用した場合や, 運の悪いときは, 誤って euc-japan と認識されます.

[70] Add UTF-7 to replacement encoding list? / Encoding sniffing · Issue #68 · whatwg/encoding, https://github.com/whatwg/encoding/issues/68

[71] Encoding: make it clear sniffing for UTF-8 is not acceptable by annevk · Pull Request #14455 · web-platform-tests/wpt · GitHub, https://github.com/web-platform-tests/wpt/pull/14455

テストデータ

文脈

[26] 文字コードの判定の応用

関連

[55] 文字コード選択メニュー

メモ

[49] [ptexenc] 入力ファイルの文字コードの自動判定 · Issue #142 · texjporg/tex-jp-build, https://github.com/texjporg/tex-jp-build/issues/142

[69] >>68 Accept-Language:, User-Agent: (OS), アクセス者の IPアドレスを使って文字符号化を推定する。 平成25年。