我在获取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解释的情况下将widechars放入RichEdit,或者我需要对其进行编码?我考虑过尝试UTF-8,或者使用RTF中的编码工具,但我不确定最好的选择是什么。
发布于 2009-11-23 19:09:13
我最近不得不这样做,并注意到您正在进行的相同类型的观察。
似乎,尽管MSDN几乎建议,"RTF“解析器只能使用8位编码。因此,我最终使用的是UTF-8,它是一种8位编码,但仍然可以表示整个Unicode字符范围。您可以通过WideCharToMultiByte()从PWSTR获取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-24 01:14:54
RTF是ASCII,任何ASCII以外的字符都将使用转义序列进行编码。RTF 1.9.1 specification (March 2008)
发布于 2011-10-19 23:04:31
看看\n rtf规范中的文字,因此您必须将宽字符串转换为\u902?\u300?\u888?http://www.biblioscape.com/rtf15_spec.htm#Heading9这样的unicode字符串。本例中的数字表示字符的十进制代码,问号是在RichEdit不支持unicode (RichEdit v1.0)时将替换unicode字符的字符。
例如,对于unicode字符串L"TIME“,rtf数据将是"\u84?\u73?\u77?\u69?”
https://stackoverflow.com/questions/1782409
复制相似问题