29

私のプログラムは、さまざまなエンコーディングを使用するファイルを読み取る必要があります。それらは、ANSI、UTF-8、またはUTF-16(ビッグエンディアンまたはリトルエンディアン)の場合があります。

BOM(バイト順マーク)があれば問題ありません。ファイルがUTF-8かUTF-16BEかLEかはわかります。

BOMがない場合、ファイルはANSIであると想定したかったのです。しかし、私が扱っているファイルにはBOMがないことがよくあります。したがって、BOMがないということは、ファイルがANSI、UTF-8、UTF-16 BE、またはLEであることを意味する場合があります。

ファイルにBOMがない場合、ファイルの一部をスキャンして、エンコーディングのタイプを最も正確に推測するための最良の方法は何でしょうか。ファイルがANSIの場合は100%近く、UTF形式の場合は90年代後半になりたいです。

これを決定するための一般的なアルゴリズムの方法を探しています。しかし、私は実際にはUnicodeを知っていてTEncodingクラスを持つDelphi 2009を使用しているので、それに固有のものはボーナスになります。


答え:

ShreevatsaRの回答により、Googleで「ユニバーサルエンコーディング検出器デルファイ」を検索しました。この投稿が約45分間生きていた後、この投稿が1位に掲載されたことに驚きました。それは速いグーグルボッティングです!また、Stackoverflowがすぐに1位になるのも驚くべきことです。

Googleの2番目のエントリは、さまざまな言語のアルゴリズムをリストした文字エンコード検出に関するFredEakerのブログエントリでした。

そのページでDelphiについての言及を見つけたので、Delphiで記述されMozillaのi18nコンポーネントに基づいたSourceForgeの無料のオープンソースChsDet文字セット検出器に直接たどり着きました。

素晴らしい!答えてくれたすべての人に感謝します(すべて+1)、ShreevatsaRに感謝し、Stackoverflowにもう一度感謝します。1時間以内に私の答えを見つけるのを手伝ってくれました!

4

4 に答える 4

9

Chardet: Universal Encoding Detectorを使用する Python スクリプトにシェルアウトできるかもしれません。これは、Firefox で使用されている文字エンコード検出の再実装であり、さまざまなアプリケーションで使用されています。役に立つリンク: Mozilla のコード、基になった研究論文(皮肉なことに、私の Firefox はそのページのエンコーディングを正しく検出できません)、簡単な説明詳細な説明.

于 2008-12-16T23:36:44.057 に答える
5

これがメモ帳のやり方です

確認できるpythonUniversalEncodingDetectorもあります。

于 2008-12-16T23:13:36.660 に答える
4

私の推測は:

  • まず、ファイルのバイト値が32未満かどうかを確認します(タブ/改行を除く)。含まれている場合は、ANSIまたはUTF-8にすることはできません。したがって、-UTF-16。エンディアンを把握する必要があります。このためには、おそらく有効なUnicode文字コードのテーブルを使用する必要があります。無効なコードに遭遇した場合は、それが当てはまる場合は他のエンディアンを試してください。どちらかが当てはまる(または当てはまらない)場合は、どちらが英数字コードの割合が高いかを確認してください。また、改行を検索して、それらからエンディアンを判別することもできます。それ以外は、エンディアンをチェックする方法がわかりません。
  • ファイルに32未満の値が含まれていない場合(上記の空白を除く)、おそらくANSIまたはUTF-8です。UTF-8として解析してみて、無効なUnicode文字がないかどうかを確認してください。もしそうなら、それはおそらくANSIです。
  • 英語以外のシングルバイトまたはマルチバイトの非Unicodeエンコーディングのドキュメントを期待している場合は、運が悪いです。あなたができる最善のことは、文字値のヒストグラムを作成し、それを既知の言語のヒストグラムと比較するInternetExplorerのようなものです。かなり頻繁に機能しますが、失敗することもあります。また、すべての言語の文字ヒストグラムの大規模なライブラリが必要になります。
于 2008-12-16T23:11:08.710 に答える
1

ASCII?最近のOSはもはやASCIIを使用していません。それらはすべて、少なくとも8ビットコードを使用します。つまり、UTF-8、ISOLatinX、WinLatinX、MacRoman、Shift-JIS、またはその他のコードのいずれかです。

私が知っている唯一のテストは、無効なUTF-8文字をチェックすることです。何かを見つけた場合は、UTF-8にすることはできません。UTF-16でもおそらく同じことが可能です。ただし、Unicodeが設定されていない場合は、どのWindowsコードページであるかを判断するのが困難になります。

私が知っているほとんどの編集者は、ユーザーがすべての可能なエンコーディングのリストからデフォルトを選択できるようにすることでこれに対処しています。

UTF文字の有効性をチェックするためのコードがあります。

于 2008-12-16T23:10:07.633 に答える