我在 Delphi 11.1.5中遇到了基本TRichEdit
组件的字符编码问题。如果我切换键盘语言并输入匈奴/en特殊字符(ő
/ű
/²
),它不会在输出RTF中处理这种情况。它只在\ansicpgN
处存储一个代码页,而不将其存储在字体表项\fN\cpgN
中,并且它使用\'NN
代码而不是\uNNNN
。Bing说如果我切换到RichEdit 4. 1,它会解决我的问题。但我怎么能换?有人能帮帮我吗?
Bing说我应该在包含TRichEdit
控件的表单的OnCreate
事件中调用它:
SetWindowLong( RichEdit1.Handle, GWL_WNDPROC, HashCode( 'RICHEDIT41' ) );
但它无法定义适当的散列函数来提供工作散列代码。
这是一个非常简单,但有问题的RTF文档:
{\rtf1\ansi\ansicpg1250\deff0\nouicompat\deflang1038{\fonttbl{\f0\fnil\fcharset238 Arial;}{\f1\fnil\fcharset0 Arial;}{\f2\fnil\fcharset238 Times New Roman;}}
{\colortbl ;\red255\green0\blue0;}
{\*\generator Riched20 10.0.19041}\viewkind4\uc1
\pard\f0\fs24\'f5\f1\lang1033\'b2\cf1\f2\lang1038\'fb\f0\par
}
在这个例子中,我应该转换代码页为1250的ANSI \'F5
和\'fb
字符,但转换代码页为1252的ANSI \'b2
字符以获得正确的UTF-16字符串:'ő²ű'
。\fN
选择字体,但这些存储\fcharsetN
,而不是所需的\cpgX
值。
但是使用RichEdit 4.1,我不会错过\cpgN
,因为它存储了以UTF-16格式编码的特殊字符代码:\uNNNN
在内容部分。
1条答案
按热度按时间qyzbxkaa1#
TRichEdit
已经使用RichEdit 4.1,并且从 Delphi 11的初始版本开始:TRichEdit组件更新为RichEdit 4.1(MSFTEDIT.dll)
在任何情况下,
TRichEdit
本身都不会(也从来没有)格式化实际的RTF本身,这都是Microsoft所做的。因此,无论您在RTF中遇到什么问题,都应该与Microsoft一起解决,而不是Embarcadero。TRichEdit
只是向底层RichEdit发送一条EM_STREAMOUT
消息,Microsoft完成创建RTF的所有工作,TRichEdit
只是将输出写入调用方提供的TStream
对象。此外,您不能向
SetWindowLong(GWL_WNDPROC)
传递 hash code,因为它需要一个实际的函数指针。Bing给你的信息不好/不完整。