博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
未测试 Delphi读写UTF-8、Unicode格式文本文件
阅读量:6698 次
发布时间:2019-06-25

本文共 3381 字,大约阅读时间需要 11 分钟。

// UTF-8文件写入函数procedure SaveUTFFile(const FileName: string; S: string; WriteHeader: Boolean = True);varMemStream: TMemoryStream;HeaderStr: String;beginif S = '' then Exit; MemStream := TMemoryStream.Create;tryif WriteHeader thenbeginHeaderStr:=#$EF#$BB#$BF;MemStream.Write(HeaderStr[1], 3);end; S := AnsiToUtf8(S);MemStream.Write(S[1], Length(S));MemStream.Position := 0; MemStream.SaveToFile(FileName);finallyMemStream.Free;end;end;// UtF-8文件读取函数function LoadUTFFile(const FileName: string; ReadHeader: Boolean = True): string;varMemStream: TMemoryStream;S, HeaderStr:string;beginResult:='';if not FileExists(FileName) then Exit;MemStream := TMemoryStream.Create;tryMemStream.LoadFromFile(FileName);if ReadHeader thenbeginSetLength(HeaderStr, 3);MemStream.Read(HeaderStr[1], 3); if HeaderStr = #$EF#$BB#$BF thenbeginSetLength(S, MemStream.Size - 3);MemStream.Read(S[1], MemStream.Size - 3);end;end elsebeginSetLength(S, MemStream.Size);MemStream.Read(S[1], MemStream.Size);end;Result := Utf8ToAnsi(S);finallyMemStream.Free;end;end;// Unicode文件写入函数procedure SaveUnicodeFile(const FileName:string; const S: string; WriteHeader: Boolean = True);varMemStream: TMemoryStream;HeaderStr: string;WStr: WideString;beginif S = '' then exit;MemStream := TMemoryStream.Create;tryif WriteHeader thenbeginHeaderStr := #$FF#$FE;MemStream.Write(HeaderStr[1], 2);end;WStr := WideString(S);MemStream.Write(WStr[1], Length(WStr)*2);MemStream.Position := 0;MemStream.SaveToFile(FileName);finallyMemStream.Free;end;end;// Unicode文件读取函数function LoadUnicodeFile(const FileName: string; ReadHeader: Boolean = True): string;varMemStream: TMemoryStream;FlagStr: String;WStr: WideString;beginResult := '';if not FileExists(FileName) then Exit;MemStream := TMemoryStream.Create;tryMemStream.LoadFromFile(FileName); if ReadHeader thenbeginSetLength(FlagStr, 2);MemStream.Read(FlagStr[1], 2);if FlagStr = #$FF#$FE thenbeginSetLength(WStr, (MemStream.Size-2) div 2);MemStream.Read(WStr[1], MemStream.Size - 2);end;end elsebeginSetLength(WStr, MemStream.Size div 2);MemStream.Read(WStr[1], MemStream.Size);end;Result := AnsiString(WStr);finallyMemStream.Free;end;end;//保存文件procedure savetofile(const FileName:string; const S: string);varF: TextFile;beginAssignFile(F, FileName); // 将文件与F变量建立连接,后面可以使用F变量对文件进行操作。Rewrite(F); // 以追加的方式打开文件Writeln(F, S); // 将S变量中的内容追加到文本尾后。CloseFile(F); // 关闭文件end;
type  TTextFormat=(tfAnsi,tfUnicode,tfUnicodeBigEndian,tfUtf8);const  TextFormatFlag:array[tfAnsi..tfUtf8] of word=($0000,$FFFE,$FEFF,$EFBB);  function WordLoHiExchange(w:Word):Word;register;asm  XCHG AL, AHend; {
TextFormat返回文本编码类型,sText未经处理的文本 }procedure ReadTextFile(const FileName: string; var TextFormat: TTextFormat; var sText:string);var w:Word; b:Byte;begin with TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone) do try Read(w,2); w:=WordLoHiExchange(w);//因为是以Word数据类型读取,故高低字节互换 if w = TextFormatFlag[tfUnicode] then TextFormat:= tfUnicode else if w = TextFormatFlag[tfUnicodeBigEndian] then TextFormat:= tfUnicodeBigEndian else if w = TextFormatFlag[tfUtf8] then begin Read(b,1);//这里要注意一下,UFT-8必须要跳过三个字节。 TextFormat:=tfUtf8; end else begin TextFormat:=tfANSI; Position:=0; end; SetLength(sText,Size-Position); ReadBuffer(sText[1],Size-Position); finally Free; end;end;

 

转载于:https://www.cnblogs.com/chenmfly/p/4783255.html

你可能感兴趣的文章
泛型复习
查看>>
mysql-5.7中的innodb_buffer_pool_prefetching(read-ahead)详解
查看>>
转载CSDN博文精选:Android系列开发博客资源汇总
查看>>
DiscoveryService.getRemoteAdvertisements是否会获得本地通告?
查看>>
小球游戏1
查看>>
asp.net中的记忆盲区
查看>>
windows 7鼠标右键另存为没有桌面选项
查看>>
【转载】 Asp.net Mvc 3当然也不会例
查看>>
识别移动设备脚本
查看>>
股票自动交易使用协议
查看>>
[Windows Phone] 为应用添加后台计划任务 – Scheduled Task Agent
查看>>
数据库中使用自增量字段与Guid字段作主键的性能对比(补充篇)-----转
查看>>
使用 servlet 连接数据库
查看>>
流媒体服务器搭建实例——可实现录音,录像功能
查看>>
.Net/C#中Cache的用法
查看>>
[Winodows Phone 7控件详解]控件拾遗
查看>>
强大的独立日期选择器(date picker)插件 - Kalendae
查看>>
使用MinGW编译Psycopg2
查看>>
HTML与CSS(图解6):超链接
查看>>
通断时间面积法
查看>>