估计这个文件是 UTF-8 with signature 编码的。有头信息。

解决方案 »

  1.   

    是因为头信息,但是初期化的时候已经指定过编码了
    第一次读的时候,能正常读取,
    seek过后,也看过对象的currentEncoding还是UTF8,却不能跳过头信息,
    这难道不是BUG吗?
      

  2.   

        不应该算是bug,filestream是一底层文件流类,其定位不会考虑你的编码格式问题,而是以文件字节为准,你在不合适的地方使用,又未进行相应调整,只能说你使用方式不对。
        没看到你具体的代码,不知道具体错误在哪,考虑下使用其他类,如StreamReader 类等,这些类针对字符编码考虑过,应该能解决你的问题。
      

  3.   

    直接设置 stream.Position=0 就行了。如果不支持Position,说明这个流本身就不支持重新定位。
      

  4.   


    Filestream本身无关编码。而当用StreamReader等来读steam时则需要编码。StreamReader的默认行为会侦测“头信息”,(英文为BOM,Byte Order Mark)。比如观察StreamReader的构造重载就可以看到:
    StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks),其中detectEncodingFromByteOrderMark的中文就是’按头信息侦测编码‘。UTF文件流的'头信息‘为3个字节,固定为’0xEF,0xBB,0xBF‘。
    StreamReader自动侦测流的头2-4个字节,以便确定编码,因此StreamReader.ReadLine可以给出‘正确’的第一行。但是,当StreamReader的底层Stream被回滚时,StreamReader仍然按照先前确定的编码来读字符串*,因此'0xEF,0xBB,0xBF'被当成字符读取,造成了乱码。最简单的解决方案就是重新构造一个StreamReader。
    也可以自己侦测BOM,并相应的跳过0,2,3,或者4个字节: http://en.wikipedia.org/wiki/Byte_order_*StreamReader不应该跟踪底层的Stream(可以是FileStream, NetworkStream等等),因此StreamReader不知道任何底层的回滚。其次,StreamReader只能在文件头侦测编码一次,因为’头信息‘有可能是随后字符串的合法部分。
      

  5.   


    Filestream本身无关编码。而当用StreamReader等来读steam时则需要编码。StreamReader的默认行为会侦测“头信息”,(英文为BOM,Byte Order Mark)。比如观察StreamReader的构造重载就可以看到:
    StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks),其中detectEncodingFromByteOrderMark的中文就是’按头信息侦测编码‘。UTF文件流的'头信息‘为3个字节,固定为’0xEF,0xBB,0xBF‘。
    StreamReader自动侦测流的头2-4个字节,以便确定编码,因此StreamReader.ReadLine可以给出‘正确’的第一行。但是,当StreamReader的底层Stream被回滚时,StreamReader仍然按照先前确定的编码来读字符串*,因此'0xEF,0xBB,0xBF'被当成字符读取,造成了乱码。最简单的解决方案就是重新构造一个StreamReader。
    也可以自己侦测BOM,并相应的跳过0,2,3,或者4个字节: http://en.wikipedia.org/wiki/Byte_order_*StreamReader不应该跟踪底层的Stream(可以是FileStream, NetworkStream等等),因此StreamReader不知道任何底层的回滚。其次,StreamReader只能在文件头侦测编码一次,因为’头信息‘有可能是随后字符串的合法部分。

    是的。
      

  6.   


    OK,明白了问题发生的原因。
    StreamReader没有提供seek方法,确实是利用了底层的FileStream的seek方法。但是,底层的Stream的seek方法是标准接口(当然可能不支持),StreamReader完全可以主动检测是否回滚过。
    就算StreamReader(由于不明的原因)无法监测底层Stream的回滚状态,底层Stream的position总可以得到,至少可以尝试着多次判断头信息的。
    个人觉得,还是StreamReader设计时欠考虑。
    望指正
      

  7.   


    你这就有点强词夺理了,就算按你说的,有这样的需求,
    那就应该前后一致,要么都读,要么都跳过,为什么第一次跳过,seek完以后就读了。
      

  8.   

    打开文件方式错误,不能向后跳吧!!!! 检测下 open 所带参数
      

  9.   


    你这就有点强词夺理了,就算按你说的,有这样的需求,
    那就应该前后一致,要么都读,要么都跳过,为什么第一次跳过,seek完以后就读了。
    为了满足不同的需求呗
    都读,那有人不想知道文件头呢
    都跳过,那有人想知道文件头呢