我正在尝试用计算出的RTF文件的字符串填充DevExpress VCL TdxRichEditControl
,而不花时间保存文件。因此,这是一个演示项目:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
UnicodeString txt = "{\\rtf1\\deff0{\\fonttbl{\\f0 Calibri;}{\\f1 Arial Unicode MS;}{\\f2 Britannic Bold;}}{\\colortbl ;\\red0\\green0\\blue255 ;\\red255\\green0\\blue0 ;}{\\*\\defchp \\fs22}{\\*\\defpap \\sl275\\slmult1\\sa200}{\\stylesheet {\\ql\\sl275\\slmult1\\sa200\\fs22 Normal;}{\\*\\cs1\\fs22 Default Paragraph Font;}{\\*\\cs2\\sbasedon1\\fs22 Line Number;}{\\*\\cs3\\ul\\fs22\\cf1 Hyperlink;}{\\*\\ts4\\tsrowd\\fs22\\ql\\sl275\\slmult1\\sa200\\tscellpaddfl3\\tscellpaddl108\\tscellpaddfb3\\tscellpaddfr3\\tscellpaddr108\\tscellpaddft3\\tsvertalt\\cltxlrtb Normal Table;}{\\*\\ts5\\tsrowd\\sbasedon4\\fs22\\ql\\sl275\\slmult1\\sa200\\trbrdrt\\brdrs\\brdrw10\\trbrdrl\\brdrs\\brdrw10\\trbrdrb\\brdrs\\brdrw10\\trbrdrr\\brdrs\\brdrw10\\trbrdrh\\brdrs\\brdrw10\\trbrdrv\\brdrs\\brdrw10\\tscellpaddfl3\\tscellpaddl108\\tscellpaddfr3\\tscellpaddr108\\tsvertalt\\cltxlrtb Table Simple 1;}}{\\*\\listoverridetable}\\nouicompat\\splytwnine\\htmautsp\\sectd\\pard\\plain\\ql\\sl275\\slmult1\\sa200{\\f1\\fs28\\cf1 This is in blue }{\\b\\i\\f2\\fs40\\cf2 Red bold}\\b\\i\\fs22\\cf2\\par}";
TMemoryStream *AStream = new TMemoryStream();
AStream->WriteBuffer(txt.c_str(), txt.Length());
AStream->Position = 0;
AStream->SaveToFile("C:/Trash/Test.rtf");
AStream->Position = 0;
dxRichEditControl1->Document->InsertDocumentContent(dxRichEditControl1->Document->Range->Start, AStream, TdxRichEditDocumentFormat::Rtf);
AStream->Free();
}
我在此演示中将其保存到文件中,以查看发生了什么问题,并发现文件中的每个其他字符都包含空格(因此,我尝试填充此数据的组件无法显示任何内容)。当我查看文件时,这是我看到的东西的类型:
{ \ r t f 1 \ d e f f 0 { \ f o n t t b l { \ f 0 C a l i b r i ; } { \ f 1 A r i a l U n i c o d e M S ; } { \ f 2 B r i t a n n i c B o l d ; } } { \ c o l
我想坚持将txt变量存储为UnicodeString
,因为实际项目中有一个用于计算该字符串的类,但是有什么办法解决此问题?我意识到我可能会做一些耗时的工作,例如循环遍历并消除其他所有字符,但是我想要一些有效的解决方案。
RTF是7位ASCII格式,因此您完全不应将其视为UTF-16。正确的解决方案是将UnicodeString
更改为AnsiString
: