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 ). ...
随机推荐
- .NET周报 【4月第4期 2023-04-23】
国内文章 2023成都.NET线下技术沙龙圆满结束 https://www.cnblogs.com/edisonchou/p/2023_chengdu_dotnet_club_activity_rev ...
- 解决Kibana(OpenSearch)某些字段无法搜索问题
背景 最近在OpenSearch查看线上日志的时候,发现某个索引下有些字段无法直接在界面上筛选,搜索到也不高亮,非常的不方便,就像下面这样 字段左侧两个筛选按钮禁用了无法点击,提示 Unindexed ...
- AutoCAD二次开发系列教程01-如何在AutoCAD中输出Hello World
目录 01项目环境准备 02代码示例 03输出示例 04总结 05源码地址 01项目环境准备 A.开发使用的软件:AutoCAD2016.VisualStudio2022 B.建立依赖的本地库(提前从 ...
- 音视频八股文(10)-- mp4结构
介绍 mp4⽂件格式⼜被称为MPEG-4 Part 14,出⾃MPEG-4标准第14部分 .它是⼀种多媒体格式容器,⼴泛⽤于包装视频和⾳频数据流.海报.字幕和元数据等.(顺便⼀提,⽬前流⾏的视频编码格 ...
- laravel框架三级联动,详细代码
这里运用到省份表中,下面是效果图 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 需要一个省份表,里面的字段要有个pid,name这些字段 下面是控制器代码,(Cit ...
- 2021-08-03:完美洗牌问题。给定一个长度为偶数的数组arr,假设长度为N*2,左部分:arr[L1……Ln],右部分: arr[R1……Rn],请把arr调整成arr[L1,R1,L2,R2,
2021-08-03:完美洗牌问题.给定一个长度为偶数的数组arr,假设长度为N*2,左部分:arr[L1--Ln],右部分: arr[R1--Rn],请把arr调整成arr[L1,R1,L2,R2, ...
- Github Copilot Chat 初体验
最近因为阳了的缘故一直躺在床上.今天终于从床上爬起来了.不是因为好透了,而是因为我收到了申请Copilot Chat preview 权限通过的邮件.实在忍不住,于是起床开电脑在咳嗽声中进行了一番体验 ...
- 【汇编】老师太hun
老师只是随手发实验项目卡,从未提过实验报告的事情 可是 他却要在 复习周 一下子 收6次 实验报告 也不发资料,不说每次的时间点,不讲实验 这人心中有 学生 吗? 上课发 上个班直播的录播 一节课就发 ...
- vue 中render执行流程梳理
用了多年vue 今天对自己了解的render 做一个梳理 一.使用template模板 先从vue 初始化开始: 众所周知项目的main.js中定义了 var app = new Vue({})这vu ...
- Kali下压缩解压缩命令大全zip,tar,tar.gz,tar.bz2(转)
转自http://blog.csdn.net/yangjin_unique/article/details/7824852 tar 解包:tar xvf FileName.tar 打包:tar cvf ...