RichEdit中的Unicode RTF文本 [英] Unicode RTF text in RichEdit

查看:151
本文介绍了RichEdit中的Unicode RTF文本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm having trouble getting a RichEdit control to display unicode RTF text. My application is Unicode, so all strings are wchar_t strings.
If I create the control as "RichEdit20A" I can use e.g. SetWindowText, and the text is displayed with the proper formatting. If I create the control as "RichEdit20W" then using SetWindowText shows the text verbatim, i.e. all the RTF code is displayed. The same happens if I use the EM_SETTEXTEX parameter, specifying codepage 1200 which MSDN tells me is used to indicate unicode.
I've tried using the StreamIn function, but this only seems to work if I stream in ASCII text. If I stream in widechars then I get empty text in the control. I use the SF_RTF|SF_UNICODE flags, and MSDN hints that this combination may not be allowed.

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

So what to do? Is there any way to get widechars into a RichEdit without losing RTF interpretation, or do I need to encode it? I've thought about trying UTF-8, or perhaps use the encoding facilities in RTF, but am unsure what the best choice is.

推荐答案

我最近不得不这样做,并且注意到您正在做的相同类型的观察.

I had to do this recently, and noticed the same sorts of observations you're making.

尽管MSDN几乎提出了建议,但似乎"RTF"解析器仅适用于8位编码.所以我最后要做的是使用 UTF-8 ,它是8位编码,但仍然可以代表完整范围的Unicode字符.您可以通过 WideCharToMultiByte(<):

It seems that, despite what MSDN almost suggests, the "RTF" parser will only work with 8-bit encodings. So what I ended up doing was using UTF-8, which is an 8 bit encoding but still can represent the full range of Unicode characters. You can get UTF-8 from a PWSTR via WideCharToMultiByte():

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,就可以执行以下操作:

Once you have it in UTF-8, you can do:

SETTEXTEX TextInfo = {0};

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

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

当然(我本来就忽略了这一点,但是在我显露的时候...):

And of course (I left this out originally, but while I'm being explicit...):

free(Utf8);

这篇关于RichEdit中的Unicode RTF文本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆