tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 についても、厳密に言えば
必ずしも確実な手段とは言い切れなかったりします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。