私のプログラムは様々なエンコーディングを使用するファイルを読まなければなりません。それらは、ANSI、UTF-8、またはUTF-16(ビッグエンディアンまたはリトルエンディアン)です。
BOM(Byte Order Mark)があれば問題ありません。ファイルがUTF-8かUTF-16 BEかLEかを知っています。
BOMがないときにファイルがANSIであると想定したいと思いました。しかし、私が扱っているファイルにはBOMがないことがよくあります。したがって、どのBOMも、ファイルがANSI、UTF-8、UTF-16 BE、またはLEであることを意味するわけではありません。
ファイルにBOMが含まれていない場合、ファイルの一部をスキャンして最も正確にエンコードの種類を推測するための最良の方法は何でしょうか。ファイルがANSIの場合は100%、UTF形式の場合は90年代の高さに近いことを希望します。
私はこれを決定するための一般的なアルゴリズムの方法を探しています。しかし、私は実際にはUnicodeを知っていてTEncodingクラスを持っているDelphi 2009を使っているので、それに特有のものはボーナスになるでしょう。
回答:
ShreevatsaRの答えは、グーグルで "universal encoding detector delphi"を検索することにしました。それは、わずか45分の間生き残った後、この記事を#1の位置にリストしたことに驚きました!それは速いgooglebottingです!また、Stackoverflowが1位になったのも驚くべきことです。
Googleの2番目のエントリはFred Eakerのブログエントリです。文字エンコーディング検出それは様々な言語でアルゴリズムを列挙しました。
私はそのページでDelphiの言及を見つけました、そしてそれは私をまっすぐに導きましたSourceForgeの無料オープンソースChsDet文字セット検出器Delphiで書かれており、Mozillaの国際化コンポーネントに基づいています。
ファンタスティック! 1時間以内に私の答えが見つかるのを助けてくれてありがとう(all +1)、ありがとうShreevatsaR、そしてもう一度Stackoverflowに感謝する。
多分あなたは使用するPythonスクリプトにシェルアウトすることができますChardet:ユニバーサルエンコーディングディテクタ。 Firefoxで使用されている文字エンコーディング検出の再実装であり、さまざまなアプリケーション。便利なリンク:Mozillaのコード、研究論文それはに基づいていました(皮肉なことに、私のFirefoxはそのページのエンコーディングを正しく検出できません)、簡単な説明、詳しい説明。
もありますpythonユニバーサルエンコーディング検出器確認できます。
私の推測は:
ASCII?最近のOSはもはやASCIIを使用していません。これらはすべて8ビットコードを使用しています。少なくとも、UTF-8、ISOLatinX、WinLatinX、MacRoman、Shift-JIS、またはその他のものを意味します。
私が知っている唯一のテストは無効なUTF-8文字をチェックすることです。見つかった場合、それはUTF-8にはできないことがわかります。同じことがおそらくUTF-16でも可能です。しかし、Unicodeが設定されていない場合は、どのWindowsコードページかを見分けるのは難しいでしょう。
私が知っているほとんどの編集者は、これに対処するために、すべての可能なエンコーディングのリストからユーザーにデフォルトを選択させるようにしています。
UTF文字の妥当性をチェックするためのコードがあります。