WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题
在RichTextBox控件的使用中我们会遇到加载TXT文件的问题,通常我们会有两种处理方式。
一、加载TXT字符串,设置到RichTextBox
//打开并且读取文件数据
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不会卡顿。
实现如下代码,读取流并加载。
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
。
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);
//RichTextBoxStreamType.UnicodePlainText 加载
richTextBox.LoadFile(stream, RichTextBoxStreamType.UnicodePlainText);
fs.Close();
sr.Close();
stream.Close();
作者:孙泉
出处:https://www.cnblogs.com/SunSpring/p/17585574.html
如果你喜欢文章欢迎点击推荐,你的鼓励对我很有用!
本文版权归作者所有,转载需在文章页面明显位置给出原文链接。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)