2012-05-09 2 views
2

テキストファイルのエンコーディングスキーマを検出できるメソッドを作成しようとしています。私はそこに多くがあることを知っていますが、確かに自分のテキストファイルがASCII,UTF-8、またはUTF-16のいずれかであることがわかります。私はこれらの3つを検出する必要があります。誰でもこれを行う方法を知っていますか?テキストファイルのエンコーディングスキーマを確認する

+0

BOM(バイトオーダーマーク)があるかどうか知っていますか?そうであれば、それを使って型を決定することができます。 – alexn

+1

ASCIIは無視しても問題ありません。任意の有効なASCIIファイルは、常に有効なUTF-8ファイルです(ASCIIの正しい7ビット定義を使用していると仮定します)。 – Douglas

+0

BOMがない場合はSOLです。 –

答えて

1

StreamReaderを使用してエンコードを識別します。

例:

using(var r = new StreamReader(filename, Encoding.Default)) 
{ 
    richtextBox1.Text = r.ReadToEnd(); 
    var encoding = r.CurrentEncoding; 
} 
+1

StreamReaderを使用するには、既にエンコーディングを知っている必要があります。 – dan04

+1

この回答は正しいです。 ["読み込み中にBOMがある場合、StreamReaderはファイルのエンコーディングを自動的に検出しようとします。"](http://stackoverflow.com/a/3746545/1149773) – Douglas

+1

このメソッドは、ユーザーのローカルそれが望ましいかもしれないUTF8でないなら、エンコーディングしてください。ただし、完全に有効なUTF8テキストであっても、BOMがない場合はUTF8を検出できません。 –

4

まず、バイナリモードでファイルを開いて、それをメモリに読み込みます。

UTF-8(またはASCII)の場合、検証チェックを行います。 Encoding.GetEncoding("UTF-8", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback).GetString(bytes)を使用してテキストをデコードし、例外をキャッチできます。取得しない場合、データは有効なUTF-8です。 UTF-16の場合

private bool detectUTF8Encoding(string filename) 
{ 
    byte[] bytes = File.ReadAllBytes(filename); 
    try { 
     Encoding.GetEncoding("UTF-8", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback).GetString(bytes); 
     return true; 
    } catch { 
     return false; 
    } 
} 

、BOM(バイトオーダーに応じて、FE FFまたはFF FE、)を確認してください:ここではコードです。

+0

UTF-8の場合は、BOM:EF BB BFも確認できます。存在する場合、このチェックはテキストをデコードするよりもずっと迅速に成功します。 – Douglas

+0

** **の場合。 UTF-8では必須ではなく、特にUNIX系のシステムでは省略されることがあります。 – dan04

+1

はい、そうです。しかし、それは実行するためのクイックチェックであるため、成功するまで数回投げておく価値があります。 – Douglas