我在询问之前发现了一些关于编码问题的问题,但是它们不是我想要的。目前我有两个方法,最好不要修改。
//FileManager.cs
public byte[] LoadFile(string id);
public FileStream LoadFileStream(string id);
它们对所有类型的文件都能正常工作。现在我有一个文本文件的ID(它保证是一个.txt
文件),我想获得它的内容。我尝试了以下操作:
byte[] data = manager.LoadFile(id);
string content = Encoding.UTF8.GetString(data);
但显然它不适用于其他非utf8编码。为了解决编码问题,我试图先得到它的FileStream
,然后使用StreamReader
。
public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks);
我希望这个领主可以解决编码,但我仍然得到奇怪的内容。
using(var stream = manager.LoadFileStream(id))
using(var reader = new StreamReader(stream, true))
{
content = reader.ReadToEnd(); //still incorrect
}
也许我误解了detectEncodingFromByteOrderMarks
的用法?如何解决编码问题?
ByteOrderMarks有时添加到以unicode格式之一编码的文件中,以指示由多个字节组成的字符是否以大或小端序格式存储(是先存储字节1,然后存储字节0?)或者先字节0,再字节1?)当文件被windows和unix机器同时读取时,这一点尤其重要,因为它们以相反的方向写入这些多字节字符。
如果你读取一个文件,并且前几个字节等于ByteOrderMark,那么这个文件很有可能是用与ByteOrderMark匹配的unicode格式编码的。不过,正如影子巫师所说,你永远无法确定。因为它总是一个猜测,所以该选项作为参数提供。
如果在文件的第一个字节中没有ByteOrderMark,则很难猜测文件的编码。
更多信息:http://en.wikipedia.org/wiki/Byte_order_mark