TRichEdit是否支持Unicode? [英] Does TRichEdit support Unicode?

查看:181
本文介绍了TRichEdit是否支持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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆