You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Builder中TMemoryStream加载RTF到TRichEdit的格式解析问题

TRichEdit加载std::wstring格式RTF的问题

我有一段格式有效的RTF数据字符串,将其存入ANSI文本文件并重命名为*.rtf后,写字板可正常显示。该字符串是std::wstring类型,而非TUnicodeString。

可行方案:使用TStringStream加载

通过TStringStream可正常将数据加载到TRichEdit并保留RTF格式,代码如下:

TStringStream *Stream = new TStringStream(String(MyStr.c_str(), MyStr.size())) ;
Stream->Position = 0 ;
RichEdit1->PlainText = false ;
RichEdit1->Lines->LoadFromStream(Stream) ;
delete Stream ;

优化尝试:使用TMemoryStream避免内存拷贝

为避免创建String时的内存拷贝,尝试直接用TMemoryStream写入std::wstring数据,但出现问题:

TMemoryStream *Stream = new TMemoryStream() ;
Stream->Write((void*)MyStr.c_str(), MyStr.length() * 2 /*字节数*/) ;
Stream->Position = 0 ;
RichEdit1->PlainText = false ;
RichEdit1->Lines->LoadFromStream(Stream) ;
delete Stream ;

此时RichEdit仅显示纯文本(字符间隔过大),判断是编码问题。尝试指定TEncoding::Unicode后,文本显示正常但仍无法解析RTF格式;添加BOM、使用无BOM的TUnicodeEncoding也未能解决。

此外还测试了调整TStringStream编码、用TMemo中转等方法,均未解决问题。想理解为何TRichEdit能完整获取数据却无法解析RTF格式,当前使用C++ Builder 12。

编辑1

参考Remy的回复后,对TStringStream和LoadFromStream的编码转换逻辑感到困惑;同时发现向TRichEdit直接添加特殊字符(如中文“你好”)可正常保留,但通过流加载Unicode格式RTF时非拉丁字符会丢失。

编辑2

按建议使用TPointerStream加载ANSI字符串,不仅默认编码下正常,指定TEncoding::Unicode时也意外正常,无法理解此现象。


内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:35:34