タイトル : Re: ファイルからエンコードを判定 投稿日 : 2011/07/27(Wed) 14:41 投稿者 : 魔界の仮面弁士
> どのようにしたら実現可能でしょうか? Encoding クラスを使って (1) ファイル先頭に、GetPreamble メソッドに合致する BOM があるか調べる。 → 合致した場合、ほぼ間違いなく、そのエンコードであると確定する。 (2) Encoding.GetEncoding で、DecoderExceptionFallback を指定しておき、 複数のエンコードをそれぞれ試してみる。 → 文字列へと復号化する際、例外が発生したエンコードは誤りであると確定する。 のように判定すれば、ある程度の絞り込みはできるでしょう。 > アドバイス下さい。 > 宜しくお願いします。 同じバイナリが複数のエンコードで復元できてしまう事も少なくないため、 確実な判定方法という物は存在しません。上記の手法で可能性の高いものを 探し出すことぐらいはできるでしょうけれども。 たとえば、http://bit.ly/plP09U という商品を表すために、Shift_JIS エンコードで 「POLYPHONY+YRs-1000」と記述された 18 バイトのテキストファイルがあるとします。 Shift_JIS のままデコードすれば、元の「POLYPHONY+YRs-1000」に復元出来ますが、 誤って UTF-7 でデコードした場合、「POLYPHONY愛1000」という文字列に化けてしまいます。 これは、UTF-7 の「愛」が 2B 59 52 73 2D であると同時に、 Shift_JIS の「+YRs-」も 2B 59 52 73 2D で表されるからです。 あるいは、「珎瑕」と記述された 4 バイトの Shift_JIS ファイルがあるとします。 バイナリでいうと E0 DD E0 EA です。 Shift_JIS のままデコードすれば、元の「珎瑕」に復元する事が出来ますが、 誤って EUC-JP でデコードした場合、「珈琲」という文字列に化けてしまいます。 Shift_JIS と EUC-JP では、半角カナの領域および一部の漢字領域が 互いに異なる文字にマッピングされているためです。 さらに言えば、Unicode 先頭の BOM についても、厳密に言えば 必ずしも確実な手段とは言い切れなかったりします。 |