C#文件流读取集编码

C#文件流读取集编码,c#,encoding,filestream,C#,Encoding,Filestream,这里可能缺少一些明显的东西,但我似乎无法在文件流读取时设置编码。代码如下: FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read); using (fs) { byte[] buffer = new byte[chunk]; fs.Seek(chunk, SeekOrigin.Begin);

这里可能缺少一些明显的东西,但我似乎无法在文件流读取时设置编码。代码如下:

FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
            using (fs)
            {

                byte[] buffer = new byte[chunk];
                fs.Seek(chunk, SeekOrigin.Begin);
                int bytesRead = fs.Read(buffer, 0, chunk);
                while (bytesRead > 0)
                {
                    ProcessChunk(buffer, bytesRead, database, id);
                    bytesRead = fs.Read(buffer, 0, chunk);
                }

            }
            fs.Close();

其中ProcessChunk将读取的值保存到对象,然后将对象序列化为XML,但读取的字符似乎错误。编码需要是1250。我还没有看到将编码添加到文件流的选项。这里缺少什么?

使用StreamReader而不是FileStream。它有几个选项,允许您指定编码。例如:

StreamReader sr = new StreamReader(file, System.Text.Encoding.ASCII);
由于您需要编码1250,因此可以通过以下方式完成:

StreamReader sr = new StreamReader(file, System.Text.Encoding.GetEncoding(1250));
我还建议将其写为:

using (StreamReader sr = new StreamReader ...etc)

而不是在使用外部声明变量;而且您不需要在使用之外进行关闭,因为使用StreamReader而不是FileStream。它有几个选项,允许您指定编码。例如:

StreamReader sr = new StreamReader(file, System.Text.Encoding.ASCII);
由于您需要编码1250,因此可以通过以下方式完成:

StreamReader sr = new StreamReader(file, System.Text.Encoding.GetEncoding(1250));
我还建议将其写为:

using (StreamReader sr = new StreamReader ...etc)

而不是在使用外部声明变量;而且您不需要在使用之外进行关闭,因为。

您还可以同时使用FileStream和FileReader:

using (FileStream fs = new FileStream(_fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1252)))
    {                                        
        while (!sr.EndOfStream)
            ProcessLine(sr.ReadLine());
    }
}

您还可以同时使用FileStream和FileReader:

using (FileStream fs = new FileStream(_fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding(1252)))
    {                                        
        while (!sr.EndOfStream)
            ProcessLine(sr.ReadLine());
    }
}


尝试使用
StreamWriter
而不是
FileStream
,因为您正在读取字节,所以没有编码。如果这些字节构成文本,则需要编码器将这些字节转换为文本的过程。您的代码或问题中没有文本处理的痕迹(除了“我在哪里指定编码器”),因此问题是:您需要编码器吗?字符被
ProcessChunk
损坏,其代码缺失。
FileStream
仅返回字节请发布
ProcessChunk
的代码。它如何将字节转换为文本?如果在StreamReader中使用
1250
编码,或者使用
encoding.GetString
,则可以避免该问题。您可以通过
编码获得它。GetEncoding(1250)
尝试使用
StreamWriter
而不是
FileStream
,因为您正在读取字节,所以没有编码。如果这些字节构成文本,则需要编码器将这些字节转换为文本的过程。您的代码或问题中没有文本处理的痕迹(除了“我在哪里指定编码器”),因此问题是:您需要编码器吗?字符被
ProcessChunk
损坏,其代码缺失。
FileStream
仅返回字节请发布
ProcessChunk
的代码。它如何将字节转换为文本?如果在StreamReader中使用
1250
编码,或者使用
encoding.GetString
,则可以避免该问题。您可以使用
Encoding.GetEncoding(1250)
如何使用Streamreader指定块大小?我需要它从文件中指定的起始点开始,一次读取一个定义大小的块,这就是为什么我使用FileStream;只是现在编码已经解决了,您使用的是“char”而不是“byte”s。@Flopn您还没有发布
ProcessChunk
的代码。这就是造成代码混乱的原因。要让人们告诉你如何使用
StreamReader
,他们需要知道它是什么does@Richardissimo
编码。ASCII
是7位美国ASCII码页。这将像当前代码一样损坏字符-几乎所有代码页中的7位范围都是相同的,不同的是值>127,得到的是mangled@Richardissimo并复制原始错误。请改用正确的编码
Encoding.GetEncoding(1250)
如何使用Streamreader指定块大小?我需要它从文件中指定的起始点开始,一次读取一个定义大小的块,这就是为什么我使用FileStream;只是现在编码已经解决了,您使用的是“char”而不是“byte”s。@Flopn您还没有发布
ProcessChunk
的代码。这就是造成代码混乱的原因。要让人们告诉你如何使用
StreamReader
,他们需要知道它是什么does@Richardissimo
编码。ASCII
是7位美国ASCII码页。这将像当前代码一样损坏字符-几乎所有代码页中的7位范围都是相同的,不同的是值>127,得到的是mangled@Richardissimo并复制原始错误。请改用正确的编码
Encoding.GetEncoding(1250)
问1250的问题,不是1250@PanagiotisKanavos我认为每个人都有能力为这么简单的事情修改代码?;-)1252是Windows的编码集,非常常见。它更容易修复与问题匹配的答案,使之成为更好的匹配。抱歉,我当时过早地投了赞成票。这也不是玩笑,因为1252不是Windows的编码集。这是某些西欧语言中使用的编码。将其与中欧或东欧文本一起使用将使其受损,这正是OP的问题所在。1250是东欧使用的编码,也就是说,现在两个答案都不能解决原来的问题(尽管另一个答案也会丢失数据)1250@PanagiotisKanavos我认为每个人都有能力为这么简单的事情修改代码?;-)1252是Windows的编码集,非常常见。它更容易修复与问题匹配的答案,使之成为更好的匹配。抱歉,我当时过早地投了赞成票。这也不是玩笑,因为1252不是Windows的编码集。这是某些西欧语言中使用的编码。将其与中欧或东欧文本一起使用将使其受损,这正是OP的问题所在。1250是东欧使用的编码,这意味着目前两个答案都不能解决原始问题(尽管另一个答案也会丢失数据)。