估计这个文件是 UTF-8 with signature 编码的。有头信息。
解决方案 »
- 关于 AcceptTcpClient 的问题
- 高难度啊~~~~~~~求助
- 类的继承!!不懂,请教下
- 問下aspx網頁中怎么把login控件放在頁面中間?菜菜的問題
- GetType问题,如何动态获得OldDbConnection的Type
- c#打包问题
- 怎么将可变的数组的值赋给TEXTBOX,用到TEXTBOX的个数跟数组的维数一样,,
- 如何隐藏datagrid中系统的右击菜单
- 问一个一贯来可能是错误认识的问题,类在编译后还存在吗?
- 我的分哪里去了??(关于CSDN中专家分的疑惑)
- [分享]代码生成工具RazorSourceGenerator(支持多种主流DB)
- 为什么日期格式变化了C#查询SQL Server的程序却没有报错
第一次读的时候,能正常读取,
seek过后,也看过对象的currentEncoding还是UTF8,却不能跳过头信息,
这难道不是BUG吗?
没看到你具体的代码,不知道具体错误在哪,考虑下使用其他类,如StreamReader 类等,这些类针对字符编码考虑过,应该能解决你的问题。
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只能在文件头侦测编码一次,因为’头信息‘有可能是随后字符串的合法部分。
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只能在文件头侦测编码一次,因为’头信息‘有可能是随后字符串的合法部分。
是的。
OK,明白了问题发生的原因。
StreamReader没有提供seek方法,确实是利用了底层的FileStream的seek方法。但是,底层的Stream的seek方法是标准接口(当然可能不支持),StreamReader完全可以主动检测是否回滚过。
就算StreamReader(由于不明的原因)无法监测底层Stream的回滚状态,底层Stream的position总可以得到,至少可以尝试着多次判断头信息的。
个人觉得,还是StreamReader设计时欠考虑。
望指正
你这就有点强词夺理了,就算按你说的,有这样的需求,
那就应该前后一致,要么都读,要么都跳过,为什么第一次跳过,seek完以后就读了。
你这就有点强词夺理了,就算按你说的,有这样的需求,
那就应该前后一致,要么都读,要么都跳过,为什么第一次跳过,seek完以后就读了。
为了满足不同的需求呗
都读,那有人不想知道文件头呢
都跳过,那有人想知道文件头呢