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()加载

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

如果直接用 public void LoadFile (string path); 需要文件是RTF或者ASCII文本,显然我们是要加载TXT并且我的文件是UTF-8编码。
所以我们使用LoadFile(Stream, RichTextBoxStreamType)直接加载文件流,可能因为是流的关系,RichTextBox内部能缓冲加载或者其他原因,所以这种方式RichTextBox不会卡顿。

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

实现如下代码,读取流并加载。

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参数:
WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题

我们使用PlainText加载纯文本。

三、乱码

当使用上面二的方式加载UTF-8编码的TXT的时候内容全是乱码。
WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题

排查后发现问题出在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(); 

发表评论

评论已关闭。

相关文章