您的位置:首页 > 其它

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

2015-07-12 20:38 393 查看
{

在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\test_' + 'ascii_gbk.txt', ss, TEncoding.GetEncoding(936));//gbk

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

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

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

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

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

SaveFile('C:\Temp\test_' + '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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: