我无法获取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中的编码工具,但我不确定最佳选择是什么。
答案 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?”