28

私のプログラムは様々なエンコーディングを使用するファイルを読まなければなりません。それらは、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に感謝する。


  • 編集ありがとうございます。 ChsDetは動いているようです! - Edwin Yip

4 답변


9

多分あなたは使用するPythonスクリプトにシェルアウトすることができますChardet:ユニバーサルエンコーディングディテクタ。 Firefoxで使用されている文字エンコーディング検出の再実装であり、さまざまなアプリケーション。便利なリンク:Mozillaのコード研究論文それはに基づいていました(皮肉なことに、私のFirefoxはそのページのエンコーディングを正しく検出できません)、簡単な説明詳しい説明


  • おおー。それはまさに私が探しているアルゴリズムのタイプです。今私はそれがどのように機能するかを理解することができるか、単にDelphiに相当するものを見つけることができれば... - lkessler
  • ドキュメントによると、これはPythonで移植されたMozillaのcppコードです。後者はmxr.mozilla.org/seamonkey/source/extensions/universalchardet/…ただし、どのインカネーションを移植するのが簡単かはわかりません。 - Marek Jedliński
  • (続き)CPP版はもっとコメント化されているようで、移植に役立つかもしれません。 - Marek Jedliński
  • すべてのリンクが切れました。復元しようとすることができますか? - Jeroen Wiert Pluimers

5

ここはどのようにメモ帳はそれをします

もありますpythonユニバーサルエンコーディング検出器確認できます。



4

私の推測は:

  • まず、ファイルのバイト値が32未満かどうかを確認します(タブ/改行を除く)。もしそうであれば、それはANSIでもUTF-8でも構いません。このように - UTF - 16。エンディアンを理解するだけです。このためには、おそらく有効なUnicode文字コードの表をいくつか使うべきです。無効なコードに遭遇した場合、それが当てはまる場合は他のエンディアンを試してください。どちらかに収まる(または収まらない)場合は、どちらが英数字コードの割合が大きいかを確認してください。また、改行を検索してエンディアンを判断することもできます。それ以外に、エンディアンをチェックする方法がわかりません。
  • ファイルに32未満の値が含まれていない場合(上記の空白文字を除く)、おそらくANSIまたはUTF-8です。それをUTF-8として解析して、無効なUnicode文字が表示されていないか確認してください。もしそうなら、それはおそらくANSIです。
  • あなたが英語以外のシングルバイトまたはマルチバイトの非Unicodeエンコーディングのドキュメントを期待しているなら、あなたは運が悪いです。できることは、Internet Explorerのように文字値のヒストグラムを作成し、それを既知の言語のヒストグラムと比較することです。それはかなり頻繁に動作しますが、時には失敗することもあります。そして、あなたはあらゆる言語の文字ヒストグラムの大きなライブラリを持っている必要があります。


  • うーん、私はよく私のテキストファイルで32未満の値を持つバイトが表示されます。 \ n、\ r、\ tなどがあります。他のものもほとんどありません。 - Michael Burr
  • ASCII、ほとんどのANSIコードページ、およびUTF-8は、32未満のバイト値を持つキャリッジリターン、ラインフィード、水平タブ、ヌル文字などの文字を認識します。 - Windows programmer
  • フェアポイント投稿を変更します。 - Vilx-
  • 私は質問でASCIIではなくANSIを言うつもりでした。質問を今修正しました。あなたはこれを反映するようにあなたの答えを修正したいかもしれません。 - lkessler

1

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

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

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

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


  • すみません、私はASCIIではなくANSIを意味します。編集します。 - lkessler
  • Windowsにはまだデバイスドライバがあります。カーネルコードが7ビットクリーンでない場合は、後悔することになります。 - Windows programmer
  • @Windowsプログラマー:カーネルコードを7ビットクリーンにする必要があるとはどういう意味ですか。ほとんどの(すべての?)ドライバはUnicodeを扱う必要があります - 問題はMBCSからUnicodeに正しく変換されることがあります(OEMまたはデフォルトのコードページなどを使用しますか?など)。 - Michael Burr
  • ファイル名を扱うコードは、変数の文字列をコピーして変換する必要があります(PUNICODEなど)が、コンパイル時に正しくコンパイルするためには、ソースコードを7ビットクリーンにする必要があります。 - Windows programmer

リンクされた質問


関連する質問

最近の質問