Delphi:TRichEdit非默认非Unicode系统语言中的文本字符串(ANSI)
所以这是设置:
>使用TRichEdit控件创建一个新的Delphi 7应用程序.我们在这里谈论非Unicode应用程序. 所以我猜想TRichEdit在内部使用Unicode,因为更改它的Font.Charset值永远不会改变任何东西 – RichEdit正确接受任何已安装的输入语言,如果你安装了两种使用不同字符集的非拉丁语言(希腊/ GREEK_CHARSET /和Russian / RUSSIAN_CHARSET /例如)它会接受它们而不改变它的Font.Charset. 我还猜想当你得到TRichEdit的.Text(或.Lines [i])值时,它会根据Windws的非Unicode程序的默认语言将其内部Unicode文本转换为ANSI. 此外,将.Text值分配给WideString或UnicodeString也无法正常工作(文本再次在????而不是正确的字符),它不仅在您将其分配给字符串时(AnsiString) ). 所以这就是问题: 我希望能够根据我选择的字符集正确地将RichEdit的文本转换为字符串(ANSI),而不是系统的非Unicode程序的默认语言.我怎样才能做到这一点?我更喜欢不涉及第三方组件的解决方案,当然,如果不可能的话 – 任何事情都可以. 谢谢! P.S.:切换到Delphi 2009或更高版本是不可接受的解决方案. 解决方法
向底层富编辑窗口发送
EM_GETTEXTEX 消息.您传递了一个指定代码页的
GETTEXTEX 结构.
所以,这样的东西会把文本拉成UTF-16编码的WideString: function GetRichEditText(RichEdit: TRichEdit): WideString; var GetTextLengthEx: TGetTextLengthEx; GetTextEx: TGetTextEx; Len: Integer; begin GetTextLengthEx.flags := GTL_DEFAULT; GetTextLengthEx.codepage := 1200; Len := SendMessage(RichEdit.Handle,EM_GETTEXTLENGTHEX,WPARAM(@GetTextLengthEx),0); if Len=E_INVALIDARG then raise Exception.Create('EM_GETTEXTLENGTHEX failed'); SetLength(Result,Len); if Len=0 then exit; GetTextEx.cb := (Length(Result)+1)*SizeOf(WideChar); GetTextEx.flags := GTL_DEFAULT; GetTextEx.codepage := 1200; GetTextEx.lpDefaultChar := nil; GetTextEx.lpUsedDefChar := nil; SendMessage(RichEdit.Handle,EM_GETTEXTEX,WPARAM(@GetTextEx),LPARAM(PWideChar(Result))); end; 然后,您可以将该UTF-16字符串转换为您喜欢的任何代码页.如果您希望直接在特定代码页中将其拉出来,那么请执行以下操作: function GetRichEditText(RichEdit: TRichEdit; AnsiCodePage: UINT): AnsiString; var GetTextLengthEx: TGetTextLengthEx; GetTextEx: TGetTextEx; Len: Integer; begin GetTextLengthEx.flags := GTL_DEFAULT; GetTextLengthEx.codepage := AnsiCodePage; Len := SendMessage(RichEdit.Handle,Len); if Len=0 then exit; GetTextEx.cb := (Length(Result)+1)*SizeOf(AnsiChar); GetTextEx.flags := GTL_DEFAULT; GetTextEx.codepage := AnsiCodePage; GetTextEx.lpDefaultChar := nil; GetTextEx.lpUsedDefChar := nil; SendMessage(RichEdit.Handle,LPARAM(PWideChar(Result))); end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |