我正在尝试编写一个包装类TRichEdit
可以将 RTF 编码和解码为明文。
这是我到目前为止所写的:
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;
对于用户默认 ANSI 代码页可以表示的所有内容,这似乎都相当有效。
它失败了(将它们转换为?
) 对于其他字符。
有没有一种简单的方法可以在我的代码中启用正确的 Unicode 处理?
我尝试使用TEncoding.Unicode
and TEncoding.UTF8
作为编码TStringStream
当。。。的时候TRichEdit
被设定为PlainText := True
,但这不起作用。
我认为你把这个问题过于复杂化了。没有必要使用PlainText
财产根本。保留其默认设置True
。然后,读取/写入 RTF 使用LoadFromStream
and SaveToStream
。要读/写纯文本,请使用Lines.Text
财产。
这就是我能做到的最简单的事情:
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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)