8

我无法让 RichEdit 控件显示 unicode RTF 文本。我的应用程序是 Unicode,所以所有字符串都是 wchar_t 字符串。
如果我将控件创建为“RichEdit20A”,我可以使用例如 SetWindowText,并且文本以正确的格式显示。如果我将控件创建为“RichEdit20W”,那么使用 SetWindowText 会逐字显示文本,即显示所有 RTF 代码。如果我使用 EM_SETTEXTEX 参数,指定代码页 1200,MSDN 告诉我用于指示 unicode,也会发生同样的情况。
我尝试过使用 StreamIn 函数,但这似乎只有在我以 ASCII 文本进行流式传输时才有效。如果我在widechars中流式传输,那么我会在控件中得到空文本。我使用 SF_RTF|SF_UNICODE 标志,而 MSDN 提示可能不允许这种组合。

那么该怎么办?有什么方法可以在不丢失 RTF 解释的情况下将宽字符放入 RichEdit,还是我需要对其进行编码?我曾考虑过尝试 UTF-8,或者可能使用 RTF 中的编码工具,但不确定最佳选择是什么。

4

3 回答 3

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);
于 2009-11-23T11:09:12.660 回答
1

RTF 是 ASCII,ASCII 之外的任何字符都将使用转义序列进行编码。 RTF 1.9.1 规范(2008 年 3 月)

于 2009-11-23T17:14:54.387 回答
1

Take a look at \uN literal in rtf specification so you have to convert your wide string to string of unicode characters like \u902?\u300?\u888? http://www.biblioscape.com/rtf15_spec.htm#Heading9 The numbers in this case represent the characters decimal code and the question mark is the character which will replace the unicode char in case if RichEdit does not support unicode (RichEdit v1.0).

For example for unicode string L"TIME" the rtf data will be "\u84?\u73?\u77?\u69?"

于 2011-10-19T15:04:30.870 回答