#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());
}
}
}