前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题

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

作者头像
SpringSun
修改2023-08-03 09:03:23
5030
修改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);
//RichTextBoxStreamType.UnicodePlainText 加载
richTextBox.LoadFile(stream, RichTextBoxStreamType.UnicodePlainText);

fs.Close();
sr.Close();
stream.Close();

CVM

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、加载TXT字符串,设置到RichTextBox
  • 二、RichTextBox.LoadFile()加载
  • 三、乱码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档