程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> RichTextBox擴展控件的中文亂碼解決方案

RichTextBox擴展控件的中文亂碼解決方案

編輯:關於.NET

在程序中有利用RichTextBox進行一些操作的需求,無意中在CodeProject中發現了一個封裝比較完整的RichTextBox控件(http://www.codeproject.com/KB/edit/csexrichtextbox.aspx),控件封裝的還是不錯,測試界面效果如下:

 

總體來說,支持各種格式的定義以及圖片的插入,效果還是相當不錯,不過在實際中使用發現,用代碼插入的中文內容會出現亂碼。

解決方法一:

由於本身對RichTextBox的應用以及RTF格式不是很熟悉,搜索很久不得要領,沒有找到好的解決方案,後來發現有一個比較取巧的方法,就是重新利用RichTextBox的機制來生成RTF文檔內容,然後傳入RTF格式內容給控件實現,代碼如下所示:

RichTextBox rtb = new RichTextBox();
             rtb.Font = _font;
             rtb.Text = _text;
             AppendRtf(rtb.Rtf);

上面部分代碼用來替換

public void InsertTextAsRtf(string _text, Font _font, RtfColor _textColor, RtfColor _backColor)

函數部分的this.SelectedRtf = _rtf.ToString(); 即可。

修改後完整的函數代碼如下所示:

public void InsertTextAsRtf(string _text, Font _font, RtfColor _textColor, RtfColor _backColor) {
             StringBuilder _rtf = new StringBuilder();
             // Append the RTF header
             _rtf.Append(RTF_HEADER);
             // Create the font table from the font passed in and append it to the
             // RTF string
             _rtf.Append(GetFontTable(_font));
             // Create the color table from the colors passed in and append it to the
             // RTF string
             _rtf.Append(GetColorTable(_textColor, _backColor));
             // Create the document area from the text to be added as RTF and append
             // it to the RTF string.
             _rtf.Append(GetDocumentArea(_text, _font));
             //this.SelectedRtf = _rtf.ToString();
             RichTextBox rtb = new RichTextBox();
             rtb.Font = _font;
             rtb.Text = _text;
             AppendRtf(rtb.Rtf);
         }

步驟二:

上面那種方法應該是一種取巧的方法,後來學習了幾篇文章關於RichTextBox格式介紹,發現還可以通過修改裡面的一些編碼格式實現中文的處理效果的。

RichTextBox格式相關的介紹文章如下所示:

RTF文件格式研究報告 (http://www.cnpopsoft.com/article.asp?id=11)

關於RTF(富文本格式)的使用(http://blog.sina.com.cn/s/blog_5d2a73550100bcth.html)

使用C# 編程對RTF 文檔進行操作(http://www.webjx.com/htmldata/2007-10-22/1193038864.html)

使用RichTextBox的一點心得(http://blog.csdn.net/jiangxinyu/archive/2008/06/16/2552150.aspx)

看了以上文章,你會發現,文章介紹的ExRichTextBox控件的編碼頭部內容以及字體內容是設置成了支持英語(美國)以及ASCII碼,所以中文無法顯示正常導致的亂碼,如果修改了RichTextBox的編碼頭部內容和字體內容,應該就沒有問題了。原來的RichTextBox頭部內容如下:

/* RTF HEADER

          * ----------
          *
          * \rtf[N]        - For text to be considered to be RTF, it must be enclosed in this tag.
          *                  rtf1 is used because the RichTextBox conforms to RTF Specification
          *                  version 1.
          * \ansi        - The character set.
          * \ansicpg[N]    - Specifies that unicode characters might be embedded. ansicpg1252
          *                  is the default used by Windows.
          * \deff[N]        - The default font. \deff0 means the default font is the first font
          *                  found.
          * \deflang[N]    - The default language. \deflang1033 specifies US English.
          * */
         private const string RTF_HEADER = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033";

如果修改下即可支持中文:

private const string RTF_HEADER = @"{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052";

因為介紹內容如下:

1、文件基本屬性:

{\rtf1 RTF版本\ansi字符集\ansicpg936簡體中文\deff0默認字體0\deflang1033美國英語\deflangfe2052中國漢語

同樣,把字體部分稍微調整下:

// \fcharset specifies the character set of a font in the font table.
             // 0 is for ANSI.
             _fontTable.Append(@"\fcharset0 ");

修改後變為以下代碼即可:

// \fcharset specifies the character set of a font in the font table.
             // 0 is for ANSI.
             //_fontTable.Append(@"\fcharset0 ");
             _fontTable.Append(@"\fcharset134 ");

調整後測試效果如下圖所示,同樣可以實現和步驟一的效果:

內容打印:

在以上基礎上,我從別處獲取了關於RichTextBox控件的打印功能代碼,對該控件進行了功能擴充。打印效果如下圖所示:

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved