RichEdit 中的 Unicode RTF 文本

标签 unicode mfc rtf richedit

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

最佳答案

我最近不得不这样做,并注意到您所做的相同类型的观察。

似乎,尽管 MSDN 几乎建议,“RTF”解析器只能使用 8 位编码。所以我最终做的是使用 UTF-8 ,这是一种 8 位编码,但仍然可以表示所有 Unicode 字符。您可以从 PWSTR 获取 UTF-8通过 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 中拥有它,你可以这样做:
SETTEXTEX TextInfo = {0};

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

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

当然(我最初忽略了这一点,但虽然我很明确......):
free(Utf8);

关于RichEdit 中的 Unicode RTF 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1782409/

相关文章:

django - 在 JSON 中返回纯 Django 表单错误

c++ - AfxLoadLibrary 与 LoadLibrary

c++ - 如何将水印或 png 或位图添加到 CTreeCtrl 的背景中?

python - 将unicode文本输出到python中的RTF文件

mysql - 如何将 MySQL 中的 RTF 文本转换为纯文本?

日语字符的Java编码

c++ - 如何在 C++11 中使用 tinyutf8 在另一个 utf8_string 中查找 utf8_string?

javascript - 为什么这段代码会抛出 ReferenceError : test is not defined?

c++ - 如何更改 CMFCToolBar 中的按钮位置?

c# - 将 Outlook 邮件项目正文另存为 PDF