动态修改.Net StreamReader Encoding编码
日期:2007年9月19日 作者: 查看:[大字体 中字体 小字体]-
在.Net framework中StreamReader的使用encoding必须在构造器中指定,而且中途完全不可以更改。
在一般的情况下,这不会造成什么问题。一般若是从硬盘读取文件,单一文件内的编码一般都是统一的。即便是发现读错,亦可以关闭StreamReader,重启使用新的编码读取。
偏偏偶最近遇到了需要修改编码的需求,而且,我的程序没有关闭重读的机会。因为偶使用的StreamReader的BaseStream是一个Network Stream,我不可以关闭它……但是Network Stream传过来的东西很可能包涵不同的编码……GB2312,Big5,UTF8,ISO-8859-1等等……虽然是先得到编码信息,然后再读具体内容,但是,一开始使用的Stream Reader编码一旦错了,读出来的东西便再也无法恢复……会丢字之类的……
我也不可以在获得编码信息之后,重新建立一个新的Stream Reader,因为具体内容已经被原来的Stream Reader给缓冲掉了……
唯一的解决方法,便是自己实现一个可以改变CurrentEncoding属性的Stream Reader了……
全部从头写起非常不实际,偶是先当了mono的源码,从mono的Stream Reader实现代码做修改。
Stream Reader其实很简单,它内部有两个Buffer,一个是input buffer,一个是decoded buffer,前者用于缓存从base stream读过来的原始数据,后者用于缓存根据原始数据解码出来后的东西……只要看明白mono的实现中ReadBuffer这个方法,要动态修改CurrentEncoding也就不是太难了……
我需要处理的网络协议是一个行协议……偶在程序中只调用了StreamReader的Readline方法,而完全没有使用Read的两个方法,这也使得偶动态修改编码容易了许多……
偶的做法是每次调用Readline的时候,不仅移动decoded buffer的游标(pos),同时也移动input buffer一个新的游标(pos_input),做法很简单,Readline方法需要调用FindNextEOL移动游标查找换行符号……我在FindNextEOL方法添加多一行:
int FindNextEOL ()
{
FindNextInputEOL();
....而FindNextInputEOL这个新的函数,完全是FindNextEOL的翻版,只是前者处理input buffer,而后者处理decoded buffer……
如此一来,我便可以知道每次Readline之后,input buffer中还没有被上层读到的原始数据有哪些了……
然后,再把CurrentEncoding属性添加Set的方法:
set
{
encoding=value;
decoder = encoding.GetDecoder();
decoded_count = pos + decoder.GetChars (input_buffer, pos_input, cbEncoded , pos_input, decoded_buffer, pos);
}设定新编码时,程序便根据input buffer的游标(pos_input)把没有被读到的原始数据重新decode一次,并且替换掉decoded buffer中的内容。
然后,事情就搞定了……甚至不需要对Readline方法做任何修改……除了把cbEncoded这个变量放到全局里面外……
但是,偶这个修改使得Read的两个方法变得完全不可以用……一旦调用了……便会使得input buffer与decoded buffer里面两个游标不同步……下面附上完整的代码,还望有大侠可以帮忙把Read的两个方法也给搞定了…… 先谢过……
/
- [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] 下一页
-
- 动态修改.Net StreamReader Encoding编码 相关文章:
- ·非主流QQFlash模块和动态横幅
- ·黑鹰行动军刀部队-完整攻略 - 游戏攻略
- ·QQ空间开场动画免费拿的方法
- ·用移动硬盘来安装Vista系统
- ·劳动法相关小案例:病假工资如何计算?
- ·Flash制作非常逼真的下雪视觉动画效果
- ·U盘启动电脑,USB移动硬盘启动电脑,USB外置光驱启动电脑
- ·用Msconfig设置XP启动项
- ·如何制作启动光盘
- ·Flash:闪动的星星
- 动态修改.Net StreamReader Encoding编码 相关软件
- ·万能显卡驱动
- ·万能声卡驱动
- ·《最终幻想12》超清晰CG动画
- ·万能摄像头驱动
- ·万能网卡驱动
- ·宫崎骏动画音乐合集
- ·霓虹灯动画制作软件 V5.50
- ·CS1.6 零点行动
- ·QQ搞笑表情gif动态图片集 V1.0 最新版
- ·小狗动态壁纸(二)
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
下一篇:Google邮局申请即开通的秘诀
精品推荐
热点TOP10
- ·C#编写的windows计算器-源代码
- ·用C#写计算器程序
- ·c#操作word表格
- ·AspNetPager分页控件--使用方法
- ·C#導出Excel源碼
- ·ASP.NET技巧:GridView控件自定义分页详解
- ·图片保存到数据库和从数据库读取图片并显示(c#)
- ·ASP.NET购物车的实现及结算处理
- ·客户端回调实现gridView无刷新分页
- ·ASP.NET中数据库的操作初步----增加、删除、修改
- ·C#获取本地计算机名IP,Mac地址
- ·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
- ·VS 2008和.NET 3.5 Beta2新特性介绍
- ·asp.net(C#)海量数据表高效率分页算法(易懂,不使用存储过程)
- ·Asp.net文件上传操作
- ·通常C#面试题
- ·身份证号码15位升18位(C#)
- ·ASP.NET无限级分类的非递归实现(存储过程版)
- ·asp.net开发wap程序必备:识别来访手机品牌型号
- ·ASP.NET一个最简单的会员登陆代码
特别推荐
- ·ASP.NET之上传文件管理策略
- ·ASP.NET程序中常用的三十三种代码
- ·ASP.Net中保护自定义的服务器控件
- ·C#设计的一个向导程序(Wizard)框架
- ·.net中即时消息发送的实现……
- ·ASP.NET动态创建控件之绝境求生
- ·.NET调用Oracle存储过程,使用数组类型的参数(如ArrayList)
- ·C#中水晶按钮的程序生成
- ·日历函数单元
- ·图片保存到数据库和从数据库读取图片并显示(c#)
- ·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
- ·C#中四种进程或线程同步互斥的控制方法
- ·[C#]解决读写包含汉字的txt文件时乱码的问题
- ·AspNetPager分页控件--使用方法
- ·六步使用ICallbackEventHandler实现无刷新回调
- ·从 ASP.NET 服务器控件插入客户端脚本
- ·C#導出Excel源碼
- ·Asp.net直接保存文件到客户端
- ·如何在上传的图片上写字
- ·Access 通用数据访问类(asp.net 2.0 c#)
