-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 回答