相关文章推荐
儒雅的遥控器  ·  C# ...·  3 年前    · 
乐观的黄花菜  ·  妻子在家中出轨小鲜肉,丈夫回家发现妻子出轨, ...·  3 年前    · 
礼貌的红豆  ·  北校区举行2019年新生紧急疏散演练_学生活 ...·  3 年前    · 
鼻子大的脆皮肠  ·  校园暴力_百度百科·  3 年前    · 
任性的砖头  ·  使徒子爆笑热血漫画《科学超能方法论》推出单行本·  3 年前    · 
Code  ›  WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题开发者社区
utf8 winform
https://cloud.tencent.com/developer/article/2306608
近视的金鱼
2 年前
SpringSun

WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
SpringSun
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题

WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题

作者头像
SpringSun
修改 于 2023-08-03 09:03:23
731 0
修改 于 2023-08-03 09:03:23
举报
文章被收录于专栏: 技术赋能学术

在RichTextBox控件的使用中我们会遇到加载TXT文件的问题,通常我们会有两种处理方式。

一、加载TXT字符串,设置到RichTextBox

代码语言: javascript
复制
//打开并且读取文件数据
FileStream fs = new FileStream(txtPath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.UTF8);
//读取到的所有文本字符串
string str = sr.ReadToEnd();
//将读取到的文本赋值到richTextBox中
richTextBox.Text = str;
sr.Close();
fs.Close();

这种方式不会存在编码问题,只要你 new StreamReader(fs, Encoding.UTF8) 的编码和文件编码一样,读取的 string 是正常的,然后再赋值到 richTextBox.Text 即可。

但是这种方式会使RichTextBox加载的时候非常卡。

所以我们还有另外一种方式, RichTextBox.LoadFile 方法直接加载文件进RichTextBox中。

二、RichTextBox.LoadFile()加载

如果直接用 public void LoadFile (string path); 需要文件是RTF或者ASCII文本,显然我们是要加载TXT并且我的文件是UTF-8编码。

所以我们使用 LoadFile(Stream, RichTextBoxStreamType) 直接加载文件流,可能因为是流的关系,RichTextBox内部能缓冲加载或者其他原因,所以这种方式RichTextBox不会卡顿。

实现如下代码,读取流并加载。

代码语言: javascript
复制
FileStream fs = new FileStream(txtPath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.UTF8);
//sr.BaseStream 获取Stream基础流
richTextBox.LoadFile(sr.BaseStream, RichTextBoxStreamType.PlainText);
fs.Close();
sr.Close();

关于** RichTextBoxStreamType.PlainText * *参数:

我们使用PlainText加载纯文本。

三、乱码

当使用上面二的方式加载UTF-8编码的TXT的时候内容全是乱码。

排查后发现问题出在 RichTextBoxStreamType.PlainText 上,如果按这个方式加载,那么读取的编码是按照默认编码,也就是 System.Text.Encoding.Default 。

当用System.Text.Encoding.Default 获取编码后发现默认编码是GB2312,所以必然会出现乱码。同时我们也不应该将其转成GB231,因为有些UTF-8代码无法转换到GB2312。

所以我们将文件转换成Unicode即可,并且RichTextBoxStreamType枚举值使用 UnicodePlainText 。

代码语言: javascript
复制
FileStream fs = new FileStream(txtPath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs, Encoding.UTF8);
//utf-8转Unicode
byte[] buffer = Encoding.Convert(Encoding.UTF8, Encoding.Unicode, Encoding.UTF8.GetBytes(sr.ReadToEnd()));
//将byte[]转换位内存流
Stream stream = new MemoryStream(buffer);
 
推荐文章
儒雅的遥控器  ·  C# DataGridView数据导出Excel文件 - 掘金
3 年前
乐观的黄花菜  ·  妻子在家中出轨小鲜肉,丈夫回家发现妻子出轨,妻子要丈夫原谅|婚姻|爱情|亲密关系_网易订阅
3 年前
礼貌的红豆  ·  北校区举行2019年新生紧急疏散演练_学生活动_中华女子学院北校区
3 年前
鼻子大的脆皮肠  ·  校园暴力_百度百科
3 年前
任性的砖头  ·  使徒子爆笑热血漫画《科学超能方法论》推出单行本
3 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号