【问题标题】:Filestream prepends junk characters while readFilestream 在读取时预先添加垃圾字符
【发布时间】:2010-11-13 10:09:40
【问题描述】:

我正在使用 filestream 类读取一个包含单行的简单文本文件。但似乎 filestream.read 在开头添加了一些垃圾字符。

代码下方。

using (var _fs = File.Open(_idFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
     byte[] b = new byte[_fs.Length];
     UTF8Encoding temp = new UTF8Encoding(true);
     while (_fs.Read(b, 0, b.Length) > 0)
     {
         Console.WriteLine(temp.GetString(b));
         Console.WriteLine(ASCIIEncoding.ASCII.GetString(b));


     }
 }

例如:我在文本文件中的数据只是“样本”。但是上面的代码返回

  "?sample" and
  "???sample"

这是什么原因??它是文件指示器的开始吗?有没有办法只阅读我的实际内容??

【问题讨论】:

  • 我的文本文件中的数据只是“样本”
  • @CodeInChaos,感谢您的提示,在十六进制编辑中,它看起来是“ef bb bf 73 61 6d 70 6c 65 00 and ...sample”。这是为什么.....
  • 如果您需要剥离 BOM,那么您已经做错了。见stackoverflow.com/questions/1317700/…

标签: c# filestream


【解决方案1】:

byte order mark(BOM) 由 Unicode 字符 0xFEFF 组成,用于用所用的编码标记文件。

因此,如果您将文件正确解码为 UTF8,您会将该字符作为字符串的第一个字符。如果您错误地将其解码为 ANSI,则会得到 3 个字符,因为 0xFEFF 的 UTF8 编码是字节序列“EF BB BF”,即 3 个字节。

但是你的整个代码可以替换为

File.ReadAllText(fileName,Encoding.UTF8)

这也应该删除 BOM。或者你省略编码参数,让函数自动检测编码(它使用 BOM)

【讨论】:

    【解决方案2】:

    可能是 BOM - 又名字节顺序标记。

    【讨论】:

      【解决方案3】:

      您正在从流中读取 BOM。如果您正在阅读文本,请尝试使用StreamReader,它会自动处理。

      【讨论】:

        【解决方案4】:

        试试吧

        using (StreamReader sr = new StreamReader(File.Open(path),Encoding.UTF8))
        

        它肯定会剥夺你的 BOM

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-17
          • 1970-01-01
          • 2015-07-05
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          • 2013-07-25
          相关资源
          最近更新 更多