在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();