#region 使用此代码您必须遵守如下协议: // 1.您可以自由地、无限制地将此代码或其衍生版本应用于您的商业或非商业作品中, // 您可以修改代码以使其适应您的作品。 // 2.此代码以“AS IS”形式提供,作者不承担任何责任。 // 3.无论您使用的是此代码的原始版本或者其衍生版本,您必须在您的源代码中保留此协议文本。 // 4.如果您要将此代码或其衍生版本应用于书刊、杂志及其附赠光盘等媒介时,您必须事先通知作者。 // 作者:破宝 联系方式:percyboycn@msn.com http://blog.joycode.com/percyboy/ #endregion using System; using System.Text; namespace Pb.Sample { // 使用范例: // // 假定 richbox 代表一个 RichTextBox 控件,original 为原始文本: // // string original = @"How are you? 中文测试文本 日本のテスト"; // RtfRenderer rr = new RtfRenderer(original); // richbox.Rtf = rr.Rtf; public class RtfRenderer { public RtfRenderer() { } public RtfRenderer(string text) { this.text = text; Render(); } private string text = String.Empty; private string rtf = String.Empty; public string Text { get { return text; } set { text = value; Render(); } } public string Rtf { get { return rtf; } } private int pos = 0; StringBuilder sb; private void Render() { sb = new StringBuilder(@"{\rtf1\ansi\deff0{\fonttbl{\f0\froman\fprq1\fcharset1 MS UI Gothic;}} {\colortbl ;\red255\green0\blue0;} \viewkind4\uc0\pard\f0\fs20"); // loop pos = 0; while(pos < text.Length) { char c = text[pos]; switch(c) { case '\r': sb.Append(@"\par "); if (text[pos + 1] == '\n') { pos++; } pos++; break; case '\n': sb.Append(@"\par "); pos++; break; case '<': string tmp = text.Substring(pos, 5); if (tmp == "") { sb.Append(@"\cf1"); pos += 5; } else { tmp = text.Substring(pos, 6); if (tmp == "") { sb.Append(@"\cf0"); pos += 6; } else { DecodeChar(c); pos++; } } break; default: DecodeChar(c); pos++; break; } } sb.Append(@" }"); rtf = sb.ToString(); } private void DecodeChar(char c) { uint t = Convert.ToUInt32(c); sb.Append(@"\u" + t.ToString()); } } }