如何从UnicodeString加载TMemoryStream

问题描述 投票:0回答:1

我正在尝试用计算出的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,因为实际项目中有一个用于计算该字符串的类,但是有什么办法解决此问题?我意识到我可能会做一些耗时的工作,例如循环遍历并消除其他所有字符,但是我想要一些有效的解决方案。

devexpress c++builder-2010
1个回答
0
投票

RTF是7位ASCII格式,因此您完全不应将其视为UTF-16。正确的解决方案是将UnicodeString更改为AnsiString

© www.soinside.com 2019 - 2024. All rights reserved.