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

image

如果直接用 public void LoadFile (string path); 需要文件是RTF或者ASCII文本,顯然我們是要加載TXT並且我的文件是UTF-8編碼。
所以我們使用LoadFile(Stream, RichTextBoxStreamType)直接加載文件流,可能因爲是流的關係,RichTextBox內部能緩衝加載或者其他原因,所以這種方式RichTextBox不會卡頓。

image

實現如下代碼,讀取流並加載。

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參數:
image

我們使用PlainText加載純文本。

三、亂碼

當使用上面二的方式加載UTF-8編碼的TXT的時候內容全是亂碼。
image

排查後發現問題出在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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章