首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RichEdit中的Unicode RTF文本

RichEdit中的Unicode RTF文本
EN

Stack Overflow用户
提问于 2009-11-23 19:00:41
回答 3查看 8.1K关注 0票数 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解释的情况下将widechars放入RichEdit,或者我需要对其进行编码?我考虑过尝试UTF-8,或者使用RTF中的编码工具,但我不确定最好的选择是什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-23 19:09:13

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

似乎,尽管MSDN几乎建议,"RTF“解析器只能使用8位编码。因此,我最终使用的是UTF-8,它是一种8位编码,但仍然可以表示整个Unicode字符范围。您可以通过WideCharToMultiByte()PWSTR获取UTF-8

代码语言:javascript
复制
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格式,你就可以这样做:

代码语言:javascript
复制
SETTEXTEX TextInfo = {0};

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

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

当然(我最初遗漏了这一点,但在我明确说明的时候...):

代码语言:javascript
复制
free(Utf8);
票数 11
EN

Stack Overflow用户

发布于 2009-11-24 01:14:54

RTF是ASCII,任何ASCII以外的字符都将使用转义序列进行编码。RTF 1.9.1 specification (March 2008)

票数 1
EN

Stack Overflow用户

发布于 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?”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1782409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档