-1

Shift-JIS や UTF8 NoBOM など、さまざまな形式のファイルを扱っています。少しの言語知識を使用して、ファイルが UTF8 または ShiftJIS として正しく解釈されているかどうかを検出できますが、ファイルが読み込んだタイプではないことが検出された場合、私の新しいエンコーディングを指定してファイルを再読み込みする必要なく、インメモリ配列。

現在、Shift-JIS を想定してファイルを読み込んでいます。

using (StreamReader sr = new StreamReader(path, Encoding.GetEncoding("shift-jis"), true))
{
   String line = sr.ReadToEnd();

   // Detection must be done AFTER you read from the file.  Silly rabbit.
   fileFormatCertain = !sr.CurrentEncoding.Equals(Encoding.GetEncoding("shift-jis"));
                codingFromBOM = sr.CurrentEncoding;
}

そして、それが既知の形式 (BOM がある) であるか、データが Shift-JIS として意味があるかを判断する魔法を実行した後、すべて問題ありません。ただし、データがゴミの場合は、次の方法でファイルを再読み取りしています。

using (StreamReader sr = new StreamReader(path, Encoding.UTF8))
{
    String line = sr.ReadToEnd();
}

この再読み取りステップを回避し、可能であればメモリ内のデータを再解釈しようとしています。

それとも魔法がすでに起こっていて、二重の I/O アクセスについて不必要に心配しているのですか?

4

1 に答える 1

1
var buf = File.ReadAllBytes(path);
var text = Encoding.UTF8.GetString(buf);
if (text.Contains("\uFFFD")) // Unicode replacement character
{
    text = Encoding.GetEncoding(932).GetString(buf);
}
于 2015-08-11T22:31:35.540 に答える