RichEdit中的Unicode RTF文本

时间:2009-11-23 11:00:41

标签: 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中的编码工具,但我不确定最佳选择是什么。

3 个答案:

答案 0 :(得分: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 */ }

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

SETTEXTEX TextInfo = {0};

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

SendMessage(hRichText, EM_SETTEXTEX, (WPARAM)&TextInfo, (LPARAM)Utf8);

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

free(Utf8);

答案 1 :(得分:1)

RTF是ASCII,ASCII中的任何字符都将使用转义序列进行编码。 RTF 1.9.1 specification (March 2008)

答案 2 :(得分:1)

在rtf规范中查看\ uN literal,这样你就必须将你的宽字符串转换为unicode字符串,如\ u902?\ u300?\ u888? http://www.biblioscape.com/rtf15_spec.htm#Heading9 这种情况下的数字表示十进制代码字符,如果RichEdit不支持unicode(RichEdit v1.0),则问号是替换unicode char的字符。

例如对于unicode字符串L“TIME”,rtf数据将是“\ u84?\ u73?\ u77?\ u69?”