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

本文关键字:新读取 读取 BOM 磁盘 转换 Shift-JIS 文件 UTF8 | 更新日期: 2023-09-27 18:07:15

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

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

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