RichEdit中的Unicode RTF文本

8 unicode mfc rtf richedit

我在获取RichEdit控件以显示unicode RTF文本时遇到问题.我的应用程序是Unicode,因此所有字符串都是wchar_t字符串.
如果我将控件创建为"RichEdit20A",我可以使用例如SetWindowText,并以正确的格式显示文本.如果我将控件创建为"RichEdit20W",则使用SetWindowText逐字显示文本,即显示所有RTF代码.如果我使用EM_SETTEXTEX参数,指定MSDN告诉我的代码页1200用于指示unicode,则会发生同样的情况.
我已经尝试过使用StreamIn函数,但是如果我在ASCII文本中流式传输,这似乎只能起作用.如果我在widechars中流,那么我在控件中得到空文本.我使用SF_RTF | SF_UNICODE标志,MSDN暗示可能不允许这种组合.

那么该怎么办?有没有办法让宽带进入RichEdit而不会丢失RTF解释,或者我需要对其进行编码吗?我曾考虑尝试使用UTF-8,或者使用RTF中的编码工具,但我不确定最佳选择是什么.

asv*_*kau 11

我最近不得不这样做,并注意到你正在做的同样的观察.

看起来,尽管MSDN几乎暗示,"RTF"解析器只能用于8位编码.所以我最终做的是使用UTF-8,这是一个8位编码,但仍然可以代表全部Unicode字符.您可以PWSTR通过WideCharToMultiByte()获得UTF-8 :

PWSTR WideString = /* Some string... */;
DWORD WideLength = wcslen(WideString) + 1;
PSTR Utf8;
DWORD Length;
INT ReturnedLength;

// A utf8 representation shouldn't be longer than 4 times the size
// of the utf16 one.
Length = WideLength * 4;
Utf8 = malloc(Length);
if (!Utf8) { /* TODO: handle failure */ }

ReturnedLength = WideCharToMultiByte(CP_UTF8,
                                     0,
                                     WideString,
                                     WideLength-1,
                                     Utf8,
                                     Length-1,
                                     NULL,
                                     NULL);
if (ReturnedLength)
{
   // Need to zero terminate...
   Utf8[ReturnedLength] = 0;
}
else { /* TODO: handle failure */ }
Run Code Online (Sandbox Code Playgroud)

一旦你有UTF-8,你可以这样做:

SETTEXTEX TextInfo = {0};

TextInfo.flags = ST_SELECTION;
TextInfo.codepage = CP_UTF8;

SendMessage(hRichText, EM_SETTEXTEX, (WPARAM)&TextInfo, (LPARAM)Utf8);
Run Code Online (Sandbox Code Playgroud)

当然(我最初离开了这个,但是我明白了......):

free(Utf8);
Run Code Online (Sandbox Code Playgroud)