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