将文件从 Shift-JIS 转换为 UTF8 无 BOM,无需重新从磁盘读取

Convert a file froM Shift-JIS to UTF8 No BOM without re-reading from disk

我正在处理多种格式的文件,包括 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 访问?

var buf = File.ReadAllBytes(path);
var text = Encoding.UTF8.GetString(buf);
if (text.Contains("\uFFFD")) // Unicode replacement character
{
    text = Encoding.GetEncoding(932).GetString(buf);
}