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();
WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题的更多相关文章
- android html 图片处理类--加载富文本工具类
在android开发中,一些资讯类页面,里面有html标签和图片,html 标签一般通过Html.fromHtml方法,即可以解决,但是如果html 有图片标签,那么,Html.fromHtml 好像 ...
- ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失
代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLe ...
- Android WebView 加载富文本内容
WebView加载数据的方式有两种: 1. webView.loadUrl(data);//加载url 2. webView.loadDataWithBaseURL(null,data, " ...
- 记录一下UILabel加载富文本 iOS
一般情况下我们都习惯用webview加载富文本.但是webview比较消耗内存.然后发现其实本身可以用uilabel加载,性能还不错就记录下~~ 核心方法下面两个 -(NSMutableAttribu ...
- DELPHI7加载UNICODE编码格式的TXT显示为乱码的解决方法
DELPHI7的STRING默认是ANSI编码,加载UNICODE编码格式的TXT显示为乱码,解决方法如下: procedure TForm1.Button1Click(Sender: TObject ...
- winform 界面加载慢原因分析
公司新来的开发人员,对winform开发还不是特别精通,在做个性化界面体验的时候容易出现闪烁和加载慢 闪烁的话,通过winform窗体的双缓存来解决在form 窗体中增加如下代码 protected ...
- winform异步加载数据到界面
做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...
- Winform动态加载TabControl用法
private void BindTabData() { dtIPD = new DataTable(); //drItem = new DataTable(); //获取[项目大类]列表显示于 Ta ...
- 构建基于Chromium的应用程序(Winform程序加载Html页面)
chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...
- winform 如何加载Url图像(图像)
解决方法: 1pictureBox1.Image = Image.FromStream(System.Net.WebRequest.Create(http://www.baidu/new.gif ). ...
随机推荐
- 【必知必会的MySQL知识】②使用MySQL
目录 前言 启动MySQL服务 连接MySQL MySQL数据库基本命令 小结 前言 根据上一篇文章[必知必会的MySQL知识]①初探MySQL的内容,想必您对MySQL数据库有了一个整体的了解了,并 ...
- 浅谈如何使用 github.com/kardianos/service
在实际开发过程中,有时候会遇到如何编写Go开机自启服务的需求,在linux中我们可以使用systemd来进行托管,windows下可以通过注册表来实现,mac下可以通过launchd来实现,上面的方式 ...
- Pytorch数据操作
1.Pytorch中tensor的生成与访问 可以使用arange()创建一个张量:如,torch.arange(12)创建0开始的前12个整数: 除非特殊指定,否则新的张量将存放在内存中,并采用CP ...
- json函数
Python与JSON(load.loads.dump.dumps) 1.Python中加载JSON 使用loads(string):作用将string类型转为dict字典或dict链表 # 加载 ...
- 局部添加加载中效果loading (vue+elementUI)
产品需求:有时候我们不想为整个页面添加loading效果.只想给局部区域添加loading效果.(这效果就不揍产品了) 在一个表格数据加载时,因为需要连接其它东西,所以后台接口返回数据需要较长时间,因 ...
- 【GiraKoo】Android Studio调试时,提示port无法打开
Android Studio调试时,提示port无法打开 现象描述 在Android Studio在进行调试时,无法正常运行.App闪退. IDE提示: Error running 'app': Un ...
- Error in render: “TypeError: Cannot read property ‘0‘ of null“
我们web的同学运行程序时经常会遇到如下错误,而查找起来却相当费劲 看错误提示第一反应会想到是不是我的js 方法中的某个对象取值错误了,如: 但完全错了,当你把方法里的js 翻来覆去找了一遍又一遍,任 ...
- weex项目使用iconfont 字体图标
一.使用本地字体图标 1.在 https://www.iconfont.cn/manage/index 注册自己的账号 2.创建自己的项目 3.添加自己需要的图标,并将其下载到本地 4.入口页面引入 ...
- (亲测有效-专门解决Mac环境)Pycharm 解决无法打开的问题
前提是Mac 安装了PyCharm.app 1.第一步:先输入: cd /Applications/PyCharm.app/Contents/MacOS 2.第二步:查看无法打开pycharm的原因, ...
- 为什么要学习 Markdown?究竟有什么用?
点击上方蓝字设为星标 下面开始今天的学习- 本文经授权转载自微信公众号:杰哥的 IT 之旅(ID:Jake_Internet),未经许可,禁止二次转载. 一.什么是 Markdown? Markdow ...