Показать сообщение отдельно
  #64  
Старый 16.07.2010, 23:31
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Код:
unit UTF8;

interface
 uses Classes;
type
TFormatterBase=class

public
  procedure SaveToFile(AStream : TStream; AText : String); virtual; abstract;
  function LoadFromFile(AStream : TStream) : String;  virtual; abstract;
  function IsFormat(AStream : TStream) : Boolean;  virtual; abstract;
end;


TFormatterUTF8=class(TFormatterBase)
private

Function FormatToAscii(s:UTF8string):AnsiString;
Function AsciiToFormat(s:AnsiString):UTF8String;

 public

  procedure SaveToFile(AStream : TStream; AText : String); override;
  function LoadFromFile(AStream : TStream) : String;  override;
  function IsFormat(AStream : TStream) : Boolean;  override;
end;


implementation

{ TFormatterUTF8 }

function TFormatterUTF8.AsciiToFormat(s: AnsiString): UTF8String;
var
  L: Integer;
  Temp: UTF8String;
begin
  Result := '';
  if S = '' then Exit;
  SetLength(Temp, Length(S) * 3);

  L := UnicodeToUtf8(PChar(Temp), Length(Temp)+1, PWideChar(S), Length(S));
  if L > 0 then
    SetLength(Temp, L-1)
  else
    Temp := '';
  Result := Temp;

end;

function TFormatterUTF8.FormatToAscii(s: UTF8string): AnsiString;
var
  L: Integer;
  Temp: WideString;
begin
  Result := '';
  if S = '' then Exit;
  SetLength(Temp, Length(S));

  L := Utf8ToUnicode(PWideChar(Temp), Length(Temp)+1, PChar(S), Length(S));
  if L > 0 then
    SetLength(Temp, L-1)
  else
    Temp := '';
  Result := Temp;

end;

function TFormatterUTF8.IsFormat(AStream: TStream): Boolean;
var
b:cardinal;
const
sign=$BFBBEF;
begin

 AStream.ReadBuffer(b,3);
 Result:=sign=b;
end;

function TFormatterUTF8.LoadFromFile(AStream: TStream): String;
var
 Str:TStringStream;
begin
  if IsFormat(AStream) then
   begin
    Str:=TStringStream.Create(Result);
    Str.CopyFrom(AStream,AStream.Size);
    Result:=FormatToAscii(Result);
   Str.Free; 
   end;
end;

procedure TFormatterUTF8.SaveToFile(AStream: TStream; AText: String);

begin
  inherited;

end;

end.

Пока нет сохранения в файл - там компилятор пишет Variable required
Ответить с цитированием