TRichEdit是否支持Unicode? [英] Does TRichEdit support Unicode?
问题描述
我正在尝试围绕 TRichEdit
编写一个包装类,该类可以对RTF进行明文编码和解码。
这是我到目前为止所写的:
type
TRTF = class
private
FRichEdit:TRichEdit;
过程SetText(const AText:string);
函数GetText:字符串;
类函数Convert(const AInput:string; AEncode:Boolean):string;排队;静态的;
public
构造函数Create;
析构函数销毁;覆盖
类函数Decode(const AInput:string):string;静态的;
类函数Encode(const AInput:string):string;静态的;
结尾;
构造函数TRTF.Create;
开始
FRichEdit:= TRichEdit.CreateParented(HWND_MESSAGE);
结尾;
析构函数TRTF。
开始
FRichEdit.Free;
继承了;
结尾;
函数TRTF.GetText:字符串;
var
流:TStringStream;
从
开始,如果FRichEdit.PlainText然后开始
Stream:= TStringStream.Create(’,'TEncoding.ANSI);
结束,否则开始
Stream:= TStringStream.Create(’’,TEncoding.ASCII);
结尾;
试试
FRichEdit.Lines.SaveToStream(Stream,Stream.Encoding);
结果:= Stream.DataString;
最后
流。免费;
结尾;
结尾;
过程TRTF.SetText(const AText:string);
var
流:TStringStream;
如果FRichEdit.PlainText开始
然后开始
Stream:= TStringStream.Create(AText,TEncoding.ANSI);
结束,否则开始
Stream:= TStringStream.Create(AText,TEncoding.ASCII);
结尾;
试试
Stream.Seek(0,TSeekOrigin.soBeginning);
FRichEdit.Lines.LoadFromStream(Stream);
最后
流。免费;
结尾;
结尾;
类函数TRTF.Convert(const AInput:string; AEncode:Boolean):string;
var
RTF:TRTF;
开始
RTF:= TRTF.Create;
试试
RTF.FRichEdit.PlainText:= AEncode;
RTF.SetText(AInput);
RTF.FRichEdit.PlainText:=不是AEncode;
结果:= RTF.GetText;
最终
RTF。免费;
结尾;
结尾;
类函数TRTF.Encode(const AInput:string):string;
开始
结果:= Convert(AInput,True);
结尾;
类函数TRTF.Decode(const AInput:string):string;
开始
结果:= Convert(AInput,False);
结尾;
对于用户默认的ANSI代码页可以表示的所有内容,这似乎都工作得很好。 / p>
其他字符却失败(将其转换为?
)。
是否有一种简单的方法可以在代码中启用正确的Unicode处理?
我尝试使用 TEncoding.Unicode
和 TEncoding.UTF8
作为 TStringStream
的编码,当 TRichEdit
设置为 PlainText:= True
,但这不起作用。
我认为您过于复杂了。完全不需要使用 PlainText
属性。将其保留为默认设置 True
。然后,要读取/写入RTF,请使用 LoadFromStream
和 SaveToStream
。要读取/写入纯文本,请使用 Lines.Text
属性。
做到:
type
TRTF =类
严格私有
类函数CreateRichEdit:TRichEdit ;静态的;
public
类函数Decode(const AInput:string):string;静态的;
类函数Encode(const AInput:string):string;静态的;
结尾;
类函数TRTF.CreateRichEdit:TRichEdit;
开始
结果:= TRichEdit.CreateParented(HWND_MESSAGE);
结尾;
类函数TRTF.Encode(const AInput:string):string;
var
RichEdit:TRichEdit;
流:TStringStream;
开始
RichEdit:= CreateRichEdit;
试试
RichEdit.Lines.Text:= AInput;
Stream:= TStringStream.Create;
试试
RichEdit.Lines.SaveToStream(Stream);
结果:= Stream.DataString;
最后
流。免费;
结尾;
最终
RichEdit.Free;
结尾;
结尾;
类函数TRTF.Decode(const AInput:string):string;
var
RichEdit:TRichEdit;
流:TStringStream;
开始
RichEdit:= CreateRichEdit;
试试
Stream:= TStringStream.Create(AInput);
试试
RichEdit.Lines.LoadFromStream(Stream);
结果:= RichEdit.Lines.Text;
最后
流。免费;
结尾;
最终
RichEdit.Free;
结尾;
结尾;
I'm trying to write a wrapper class around TRichEdit
that can encode and decode RTF to/from plaintext.
This is what I've written so far:
type
TRTF = class
private
FRichEdit : TRichEdit;
procedure SetText(const AText: string);
function GetText: string;
class function Convert(const AInput: string; AEncode: Boolean): string; inline; static;
public
constructor Create;
destructor Destroy; override;
class function Decode(const AInput: string): string; static;
class function Encode(const AInput: string): string; static;
end;
constructor TRTF.Create;
begin
FRichEdit := TRichEdit.CreateParented(HWND_MESSAGE);
end;
destructor TRTF.Destroy;
begin
FRichEdit.Free;
inherited;
end;
function TRTF.GetText: string;
var
Stream: TStringStream;
begin
if FRichEdit.PlainText then begin
Stream := TStringStream.Create('', TEncoding.ANSI);
end else begin
Stream := TStringStream.Create('', TEncoding.ASCII);
end;
try
FRichEdit.Lines.SaveToStream(Stream, Stream.Encoding);
Result := Stream.DataString;
finally
Stream.Free;
end;
end;
procedure TRTF.SetText(const AText: string);
var
Stream: TStringStream;
begin
if FRichEdit.PlainText then begin
Stream := TStringStream.Create(AText, TEncoding.ANSI);
end else begin
Stream := TStringStream.Create(AText, TEncoding.ASCII);
end;
try
Stream.Seek(0, TSeekOrigin.soBeginning);
FRichEdit.Lines.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
class function TRTF.Convert(const AInput: string; AEncode: Boolean): string;
var
RTF: TRTF;
begin
RTF := TRTF.Create;
try
RTF.FRichEdit.PlainText := AEncode;
RTF.SetText(AInput);
RTF.FRichEdit.PlainText := not AEncode;
Result := RTF.GetText;
finally
RTF.Free;
end;
end;
class function TRTF.Encode(const AInput: string): string;
begin
Result := Convert(AInput, True);
end;
class function TRTF.Decode(const AInput: string): string;
begin
Result := Convert(AInput, False);
end;
This seems to be working reasonably well for everything that can be represented by the user default ANSI codepage.
It fails (converts them to ?
) for other characters though.
Is there an easy way to enable correct Unicode handling in my code?
I tried to use TEncoding.Unicode
and TEncoding.UTF8
as the encoding for the TStringStream
when the TRichEdit
is set to PlainText := True
, but that doesn't work.
I think you are over-complicating this. There's no need to use the PlainText
property at all. Leave it at its default setting of True
. Then, to read/write RTF use LoadFromStream
and SaveToStream
. And to read/write plain text use the Lines.Text
property.
This is about as simple as I can make it:
type
TRTF = class
strict private
class function CreateRichEdit: TRichEdit; static;
public
class function Decode(const AInput: string): string; static;
class function Encode(const AInput: string): string; static;
end;
class function TRTF.CreateRichEdit: TRichEdit;
begin
Result := TRichEdit.CreateParented(HWND_MESSAGE);
end;
class function TRTF.Encode(const AInput: string): string;
var
RichEdit: TRichEdit;
Stream: TStringStream;
begin
RichEdit := CreateRichEdit;
try
RichEdit.Lines.Text := AInput;
Stream := TStringStream.Create;
try
RichEdit.Lines.SaveToStream(Stream);
Result := Stream.DataString;
finally
Stream.Free;
end;
finally
RichEdit.Free;
end;
end;
class function TRTF.Decode(const AInput: string): string;
var
RichEdit: TRichEdit;
Stream: TStringStream;
begin
RichEdit := CreateRichEdit;
try
Stream := TStringStream.Create(AInput);
try
RichEdit.Lines.LoadFromStream(Stream);
Result := RichEdit.Lines.Text;
finally
Stream.Free;
end;
finally
RichEdit.Free;
end;
end;
这篇关于TRichEdit是否支持Unicode?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!