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

时间:2015-08-10 17:06:37

标签: c# utf-8 shift-jis

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

1 个答案:

答案 0 :(得分: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);
}