web-dev-qa-db-ja.com

文字エンコーディング検出アルゴリズム

ドキュメント内の文字セットを検出する方法を探しています。私はここでMozilla文字セット検出実装を読んでいます:

ユニバーサル文字セット検出

私はまた、Java jCharDetと呼ばれるこれの実装を見つけました:

JCharDet

これらは両方とも、一連の静的データを使用して実施された調査に基づいています。誰かが他の実装をうまく使用したかどうか、そしてもしそうなら何ですか?独自のアプローチを採用しましたか?その場合、キャラクターセットを検出するために使用したアルゴリズムは何でしたか

任意の助けいただければ幸いです。私はGoogleを介した既存のアプローチのリストを探していません。また、Joel Spolskyの記事へのリンクも探していません。

UPDATE:私はこれについてたくさんの研究を行い、プラグイン可能なアプローチを使用して文字検出に使用するcpdetectorと呼ばれるフレームワークを見つけました、以下を参照してください:

CPDetector

これにより、BOM、chardet(Mozillaアプローチ)、およびASCII検出プラグインが提供されます。独自のプラグインを作成することも非常に簡単です。Mozillaアプローチ/ jchardetなどよりもはるかに優れた文字検出を提供する別のフレームワークもあります。 ...

ICU4J

このフレームワークを使用してより正確な文字エンコーディング検出アルゴリズムを提供する独自のcpdetectorプラグインを作成するのは非常に簡単です。 Mozillaのアプローチよりもうまく機能します。

44
Jon

数年前、メールアプリケーション用の文字セット検出機能があり、独自に開発しました。メールアプリは実際にはWAPアプリケーションであり、電話はUTF-8を想定していました。いくつかのステップがありました:

ユニバーサル

バイト2/3などの上位ビットに特定のビットパターンがあるため、テキストがUTF-8かどうかを簡単に検出できました。そのパターンが特定の回数繰り返されることがわかったら、それがUTF-8であると確信できます。

ファイルがUTF-16バイトオーダーマークで始まる場合、おそらくテキストの残りの部分がそのエンコーディングであると想定できます。それ以外の場合、サロゲートペアのパターンを検出できない限り、UTF-16の検出はUTF-8ほど簡単ではありません。ただし、サロゲートペアの使用はまれであるため、通常は機能しません。 UTF-32も同様ですが、検出するサロゲートペアはありません。

地域検出

次に、読者が特定の地域にいると想定します。たとえば、ユーザーが日本語でローカライズされたUIを見ている場合、3つの主要な日本語エンコーディングの検出を試みることができます。 ISO-2022-JPは、エスケープシーケンスで検出するために再び東です。それが失敗した場合、EUC-JPとShift-JISの違いを判別するのは簡単ではありません。ユーザーはShift-JISテキストを受け取る可能性が高くなりますが、EUC-JPにはShift-JISに存在しない文字があり、その逆もあり、そのため、適切な一致が得られる場合があります。

同じ手順が中国語のエンコーディングと他の地域に使用されました。

ユーザーの選択

これらで満足のいく結果が得られなかった場合、ユーザーは手動でエンコードを選択する必要があります。

10
Jared Oberhaus

あなたが要求したものと正確には同じではありませんが、 ICUプロジェクトCharsetDetector クラスが含まれていることに気付きました。

7
McDowell