几个关于文本文件、字符串、编码的函数

{

在delphi中没有能把字符串直接保存为文件的方法,也没有将文件直接作为字符串读出的方法。

没有能把字符串转化为内存流的方法,也没有能把内存流转化为字符串的方法。而这里有四个函数恰能做到。

 

代码如下:

}

function StringToFile(mString: string; mFileName: TFileName): Boolean;

{ 返回字符串保存到文件是否成功 }

var

vFileChar: file of Char;//通常是以行为单位,将依次写入每一行,而这里是字,则将依次写入每个字

I: Integer;

begin

{$I-}

AssignFile(vFileChar, mFileName);

Rewrite(vFileChar);

for I := 1 to Length(mString) do

Write(vFileChar, mString[I]);

CloseFile(vFileChar);

{$I+}

Result := (IOResult = 0) and (mFileName <> '');

end; { StringToFile }

function FileToString(mFileName: TFileName): string;

{ 返回从文件载入字符串 }

var

vFileChar: file of Char;

vChar: Char;

begin

Result := '';

{$I-}

AssignFile(vFileChar, mFileName);

Reset(vFileChar);

while not Eof(vFileChar) do begin

    Read(vFileChar, vChar);

    Result := Result + vChar;

end;

CloseFile(vFileChar);

{$I+}

end; { FileToString }

function AnsiFileToString(mFileName: TFileName): Ansistring; //返回从文件载入字符串 }

var

vFileChar: file of  AnsiChar;

vChar: AnsiChar;

begin

Result := '';

{$I-}

AssignFile(vFileChar, mFileName);

Reset(vFileChar);

while not Eof(vFileChar) do begin

    Read(vFileChar, vChar);

    Result := Result + vChar;

end;

CloseFile(vFileChar);

{$I+}

end; { AnsiFileToString }

function StreamToString(mStream: TStream): string;

{ 将内存流转换成字符串 }

var

I: Integer;

begin

Result := '';

if not Assigned(mStream) then Exit;

SetLength(Result, mStream.Size);

for I := 0 to Pred(mStream.Size) do try

    mStream.Position := I;

    mStream.Read(Result[Succ(I)], 1);

except

    Result := '';

end;

end; { StreamToString }

function StringToStream(mString: string; mStream: TStream): Boolean;

{ 返回将字符串保存到内存流是否成功 }

var

I: Integer;

begin

Result := True;

try

    mStream.Size := 0;

    mStream.Position := 0;

    for I := 1 to Length(mString) do mStream.Write(mString[I], 1);

except

    Result := False;

end;

end; { StringToStream }

//一个把字符转换成各种编码文件的delphi2010函数.

   procedure SaveFile( const  FileName:  string ; Source:  string ;

    encoding: TEncoding);

  var

    sl: TStrings;

    memoStream: TFileStream;

    buff: Tbytes;

    LByteOrderMark: TBytes;

  begin

     if  Source  =   ' ' then

        exit ;

    try

      buff : =  encoding.GetBytes(Source);

      memoStream : =  TFileStream.Create(FileName, fmCreate);

      LByteOrderMark : =  encoding.GetPreamble;

      memoStream.Write(LByteOrderMark[ 0 ], Length(LByteOrderMark));

      memoStream.Write(buff[ 0 ], length(buff));

           memostream.s

    finally

      memoStream.Free;

     end ;

   end ;

    

   {SaveFile('C:Temp est_' + 'ascii_gbk.txt', ss, TEncoding.GetEncoding(936));//gbk

      SaveFile('C:Temp est_' + 'ascii_bg5.txt', ss, TEncoding.GetEncoding(950));//bg5 繁体

      SaveFile('C:Temp est_' + 'utf8.txt', ss, TEncoding.UTF8);

      SaveFile('C:Temp est_' + 'unicode.txt', ss, TEncoding.Unicode);

unicode转中文的时候必须要制定页码,不然会出现乱码.比如的以下这两句.

  SaveFile('C:Temp est_' + 'ascii_gbk.txt', ss, TEncoding.GetEncoding(936));//gbk

  SaveFile('C:Temp est_' + 'ascii_bg5.txt', ss, TEncoding.GetEncoding(950));//bg5 繁体}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

unit util_utf8;
 
interface
 
uses Windows;
 
type
 UTF8String = AnsiString;
 
function AnsiToWide(const S: AnsiString): WideString;
 function WideToUTF8(const WS: WideString): UTF8String;
 function AnsiToUTF8(const S: AnsiString): UTF8String;
 function UTF8ToWide(const US: UTF8String): WideString;
 function WideToAnsi(const WS: WideString): AnsiString;
 function UTF8ToAnsi(const S: UTF8String): AnsiString;
 
implementation
 
function AnsiToWide(const S: AnsiString): WideString;
 var len: integer;
 ws: WideString;
 begin
 Result:='';
 if (Length(S) = 0) then
 exit;
 len:=MultiByteToWideChar(CP_ACP, 0, PChar(s), -1, nil, 0);
 SetLength(ws, len);
 MultiByteToWideChar(CP_ACP, 0, PChar(s), -1, PWideChar(ws), len);
 Result:=ws;
 end;
 
function WideToUTF8(const WS: WideString): UTF8String;
 var len: integer;
 us: UTF8String;
 begin
 Result:='';
 if (Length(WS) = 0) then
 exit;
 len:=WideCharToMultiByte(CP_UTF8, 0, PWideChar(WS), -1, nil, 0, nil, nil);
 SetLength(us, len);
 WideCharToMultiByte(CP_UTF8, 0, PWideChar(WS), -1, PChar(us), len, nil, nil);
 Result:=us;
 end;
 
function AnsiToUTF8(const S: AnsiString): UTF8String;
 begin
 Result:=WideToUTF8(AnsiToWide(S));
 end;
 
function UTF8ToWide(const US: UTF8String): WideString;
 var len: integer;
 ws: WideString;
 begin
 Result:='';
 if (Length(US) = 0) then
 exit;
 len:=MultiByteToWideChar(CP_UTF8, 0, PChar(US), -1, nil, 0);
 SetLength(ws, len);
 MultiByteToWideChar(CP_UTF8, 0, PChar(US), -1, PWideChar(ws), len);
 Result:=ws;
 end;
 
function WideToAnsi(const WS: WideString): AnsiString;
 var len: integer;
 s: AnsiString;
 begin
 Result:='';
 if (Length(WS) = 0) then
 exit;
 len:=WideCharToMultiByte(CP_ACP, 0, PWideChar(WS), -1, nil, 0, nil, nil);
 SetLength(s, len);
 WideCharToMultiByte(CP_ACP, 0, PWideChar(WS), -1, PChar(s), len, nil, nil);
 Result:=s;
 end;
 
function UTF8ToAnsi(const S: UTF8String): AnsiString;
 begin
 Result:=WideToAnsi(UTF8ToWide(S));
 end;
 
end.     

原文地址:https://www.cnblogs.com/bjxsky/p/4641486.html