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
相关产品推荐
相关产品推荐

