代码之家  ›  专栏  ›  技术社区  ›  RameshVel

文件流在读取时预处理垃圾字符

  •  2
  • RameshVel  · 技术社区  · 14 年前

    我正在读取一个简单的文本文件,其中包含使用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"
    

    原因是什么??文件指示器是否启动?有没有办法只看我的真实内容??

    4 回复  |  直到 14 年前
        1
  •  2
  •   CodesInChaos    14 年前

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

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

    但你的全部代码可以用

    File.ReadAllText(fileName,Encoding.UTF8)
    

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

        2
  •  2
  •   chillitom Cee McSharpface    14 年前

    可能是BOM-a.k.a字节顺序标记。

        3
  •  0
  •   Marc Gravell    14 年前

    你正在从流中读取BOM。如果你在读书 文本 ,尝试使用 StreamReader 它会自动处理这个问题。

        4
  •  0
  •   usr-local-ΕΨΗΕΛΩΝ    14 年前

    试试看吧

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

    它肯定会把你的尸体