文本文件编码问题

时间:2011-10-18 08:24:07

标签: c# .net encoding stream

我在询问之前发现了一些关于编码问题的问题,但它们并不是我想要的。目前我有两种方法,我最好不要修改它们。

//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的用法?以及如何解决编码问题?

1 个答案:

答案 0 :(得分:1)

ByteOrderMarks 有时添加到以其中一种unicode格式编码的文件中,以指示由多个字节组成的字符是以大端还是小端格式存储(首先存储字节1,然后字节0?或字节0首先,然后字节1?)。当文件由例如windows和unix机器读取时,这尤其相关,因为它们以相反的方向写入这些多字节字符。

如果您读取文件并且前几个字节与ByteOrderMark的字节相同,则很可能文件以与ByteOrderMark匹配的unicode格式进行编码。但是,你永远不会确定,正如Shadow Wizard所提到的那样。由于它始终是一个猜测,因此该选项作为参数提供。

如果文件的第一个字节中没有ByteOrderMark,则很难猜出文件的编码。

更多信息:http://en.wikipedia.org/wiki/Byte_order_mark