在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乱码问题的更多相关文章

  1. android html 图片处理类--加载富文本工具类

    在android开发中,一些资讯类页面,里面有html标签和图片,html 标签一般通过Html.fromHtml方法,即可以解决,但是如果html 有图片标签,那么,Html.fromHtml 好像 ...

  2. ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失

    代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLe ...

  3. Android WebView 加载富文本内容

    WebView加载数据的方式有两种: 1. webView.loadUrl(data);//加载url 2. webView.loadDataWithBaseURL(null,data, " ...

  4. 记录一下UILabel加载富文本 iOS

    一般情况下我们都习惯用webview加载富文本.但是webview比较消耗内存.然后发现其实本身可以用uilabel加载,性能还不错就记录下~~ 核心方法下面两个 -(NSMutableAttribu ...

  5. DELPHI7加载UNICODE编码格式的TXT显示为乱码的解决方法

    DELPHI7的STRING默认是ANSI编码,加载UNICODE编码格式的TXT显示为乱码,解决方法如下: procedure TForm1.Button1Click(Sender: TObject ...

  6. winform 界面加载慢原因分析

    公司新来的开发人员,对winform开发还不是特别精通,在做个性化界面体验的时候容易出现闪烁和加载慢 闪烁的话,通过winform窗体的双缓存来解决在form 窗体中增加如下代码 protected ...

  7. winform异步加载数据到界面

    做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...

  8. Winform动态加载TabControl用法

    private void BindTabData() { dtIPD = new DataTable(); //drItem = new DataTable(); //获取[项目大类]列表显示于 Ta ...

  9. 构建基于Chromium的应用程序(Winform程序加载Html页面)

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  10. winform 如何加载Url图像(图像)

    解决方法: 1pictureBox1.Image = Image.FromStream(System.Net.WebRequest.Create(http://www.baidu/new.gif ). ...

随机推荐

  1. Optional避免频繁判空的神器

    1. 创建Optional //创建空的 Optional Optional<Object> optional = Optional.empty(); //创建非空的 Optional 如 ...

  2. API网关:开源Apinto网关-上游服务篇(二)

    功能介绍 服务发现是一种分布式系统中的关键技术,它能够帮助应用程序动态地发现和访问依赖的服务实例,解决了服务实例分布在不同节点上的问题.通过服务发现,应用程序可以快速找到需要调用的服务实例的位置和元数 ...

  3. vue下载文件模板(excel) 和 导出excel表格

    1. get形式传参数 仅限于get方式,注意请求头参数...,需要后台放开 window.location = '/dms-underlying-asset/download?assetType=' ...

  4. windows11 下使用 阿里云 modelscope docker 环境 运行参考

    昨天看视频 我们做了个能对话的AI派蒙,免费给大家玩! 发现阿里有一个语音转文字的模型(paraformer),之前处理这种需求一直都是直接调用服务商提交好的API接口 突然想尝试一下本地搭建,虽然和 ...

  5. #Powerbi 季度时间进度计算

    上一篇我们学习了月度时间进度的计算方法,今天我们学习季度时间进度的测算. 思路:找出目前共计消耗了多少天(季度),目前日期所在的季度共有多少天,两者相除即是季度的时间进度 首先列出DAX函数:   本 ...

  6. [安全开发] SQL注入扫描(一股子GPT味~)

    实际上大部分都是它写的,它真我哭 SQL注入扫描就是一种用于检测和预防SQL注入攻击的工具.它通过模拟SQL注入攻击的方式,向目标网站发送特定的SQL查询语句,以验证目标网站是否存在SQL注入漏洞.S ...

  7. 基于electron25+vite4创建多窗口|vue3+electron25新开模态窗体

    在写这篇文章的时候,查看了下electron最新稳定版本由几天前24.4.0升级到了25了,不得不说electron团队迭代速度之快! 前几天有分享一篇electron24整合vite4全家桶技术构建 ...

  8. MySQL之视图,索引,存储过程,触发器--实操

    一.视图 什么是视图? 视图是一个虚拟表,其内容由查询定义. 同真实的表一样,视图包含系列带有名称的列和行数据. 行和列数据来自定义视图的查询所引用的表,并且在引用视图时动态生成. 简单的来说视图是由 ...

  9. JavaSE线程基础

    1.线程概念 2.线程创建方式 1.继承thread 2.实现runnable runnable使用最多 3.线程的生命周期及线程的状态 新建状态 就绪状态的线程(已获得所有资源,栈堆内存空间),即s ...

  10. selenium-wire简介

    一.简介 以下来自chatGPT回答: selenium-wire是一个基于selenium的Python库,它扩展了selenium的功能,使得我们可以在自动化测试中直接访问和修改浏览器的网络请求和 ...