2011-10-18 43 views
2

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

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

+0

你是什么意思与“奇怪的内容”?你得到的内容是什么?它应该是什么样子?您是否使用十六进制编辑器查看了文件的第一个字节? – PVitt

+2

你[无法检测到编码](http://stackoverflow.com/questions/90838/how-can-i-detect-the-encoding-codepage-of-a-text-file)你必须自己知道它。 –

回答

1

ByteOrderMarks被有时加入到的Unicode格式之一,编码的文件,以指示从多个字节由字符是否被存储在或大或小端格式(是第一存储字节1,然后字节0?或者首先是字节0,然后是字节1?)。当例如windows和unix机器都读取文件时,这是特别相关的,因为它们以相反的方向写这些多字节字符。

如果您读取一个文件,并且前几个字节与ByteOrderMark相同,则该文件可能会以与ByteOrderMark匹配的unicode格式编码得相当高。不过,你永远不知道,就像暗影向导提到的那样。由于它总是一种猜测,因此该选项作为参数提供。

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

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