// UTF-8文件写入函数
procedure SaveUTFFile(const FileName: string; S: string; WriteHeader: Boolean = True);
var
MemStream: TMemoryStream;
HeaderStr: String;
begin
if S = '' then Exit; MemStream := TMemoryStream.Create;
try
if WriteHeader then
begin
HeaderStr:=#$EF#$BB#$BF;
MemStream.Write(HeaderStr[1], 3);
end; S := AnsiToUtf8(S);
MemStream.Write(S[1], Length(S));
MemStream.Position := 0; MemStream.SaveToFile(FileName);
finally
MemStream.Free;
end;
end;// UtF-8文件读取函数
function LoadUTFFile(const FileName: string; ReadHeader: Boolean = True): string;
var
MemStream: TMemoryStream;
S, HeaderStr:string;
begin
Result:='';
if not FileExists(FileName) then Exit;
MemStream := TMemoryStream.Create;
try
MemStream.LoadFromFile(FileName);
if ReadHeader then
begin
SetLength(HeaderStr, 3);
MemStream.Read(HeaderStr[1], 3); if HeaderStr = #$EF#$BB#$BF then
begin
SetLength(S, MemStream.Size - 3);
MemStream.Read(S[1], MemStream.Size - 3);
end;
end else
begin
SetLength(S, MemStream.Size);
MemStream.Read(S[1], MemStream.Size);
end;Result := Utf8ToAnsi(S);
finally
MemStream.Free;
end;
end;// Unicode文件写入函数
procedure SaveUnicodeFile(const FileName:string; const S: string; WriteHeader: Boolean = True);
var
MemStream: TMemoryStream;
HeaderStr: string;
WStr: WideString;
begin
if S = '' then exit;
MemStream := TMemoryStream.Create;
try
if WriteHeader then
begin
HeaderStr := #$FF#$FE;
MemStream.Write(HeaderStr[1], 2);
end;WStr := WideString(S);
MemStream.Write(WStr[1], Length(WStr)*2);
MemStream.Position := 0;
MemStream.SaveToFile(FileName);
finally
MemStream.Free;
end;
end;// Unicode文件读取函数
function LoadUnicodeFile(const FileName: string; ReadHeader: Boolean = True): string;
var
MemStream: TMemoryStream;
FlagStr: String;
WStr: WideString;
begin
Result := '';
if not FileExists(FileName) then Exit;MemStream := TMemoryStream.Create;
try
MemStream.LoadFromFile(FileName); if ReadHeader then
begin
SetLength(FlagStr, 2);
MemStream.Read(FlagStr[1], 2);if FlagStr = #$FF#$FE then
begin
SetLength(WStr, (MemStream.Size-2) div 2);
MemStream.Read(WStr[1], MemStream.Size - 2);
end;
end else
begin
SetLength(WStr, MemStream.Size div 2);
MemStream.Read(WStr[1], MemStream.Size);
end;Result := AnsiString(WStr);
finally
MemStream.Free;
end;
end;//保存文件
procedure savetofile(const FileName:string; const S: string);
var
F: TextFile;
begin
AssignFile(F, FileName); // 将文件与F变量建立连接,后面可以使用F变量对文件进行操作。
Rewrite(F); // 以追加的方式打开文件
Writeln(F, S); // 将S变量中的内容追加到文本尾后。
CloseFile(F); // 关闭文件
end;

typeTTextFormat=(tfAnsi,tfUnicode,tfUnicodeBigEndian,tfUtf8);
constTextFormatFlag:array[tfAnsi..tfUtf8] of word=($0000,$FFFE,$FEFF,$EFBB); function WordLoHiExchange(w:Word):Word;register;
asmXCHG AL, AH
end;{ TextFormat返回文本编码类型,sText未经处理的文本 }
procedure ReadTextFile(const FileName: string;var TextFormat: TTextFormat; var sText:string);
varw:Word;b:Byte;
beginwith TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone) dotryRead(w,2);w:=WordLoHiExchange(w);//因为是以Word数据类型读取,故高低字节互换if w = TextFormatFlag[tfUnicode] thenTextFormat:= tfUnicodeelse if w = TextFormatFlag[tfUnicodeBigEndian] thenTextFormat:= tfUnicodeBigEndianelse if w = TextFormatFlag[tfUtf8] thenbeginRead(b,1);//这里要注意一下,UFT-8必须要跳过三个字节。TextFormat:=tfUtf8;end elsebeginTextFormat:=tfANSI;Position:=0;end;SetLength(sText,Size-Position);ReadBuffer(sText[1],Size-Position);finallyFree;end;
end;

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

未测试 Delphi读写UTF-8、Unicode格式文本文件相关推荐

  1. 创建Unicode格式的INI文件

    前段时间由于开发一个软件,需要调用别人的接口,虽然我的软件是Unicode编码,对方的模块也是Unicode编码,但是对方提供的接口却是Ansi接口,在非中文系统下,由于涉及到中文路径,导致Ansi和 ...

  2. UTF、Unicode、ASCII及中文编码

    一.Unicode缘起 Unicode是一种字符编码规范 . 1.国际标准ASCII编码 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits)  ...

  3. linux测试磁盘读写能力

    在平时的工作中,经常需要评估一些服务器的资源,磁盘IO是其中一个容易出现瓶颈的地方,那么我们通常需要预先知道该服务器上的磁盘IO能达到多少.在这里记录一下经常用到的一个用来测试磁盘读写能力的命令. 1 ...

  4. warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失...

    从同事那里拷来两个头文件,一编译就出现了这个警告. 想要消除这个警告,几个方法: (1)转换Code文件为Unicode格式:   (2)在Project -> Properties -> ...

  5. 统计“3_人民日报语料”文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式

    统计"3_人民日报语料"文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式; 首先,统计文件的字符数,有两种方法.第一种是将文件复制到w ...

  6. 解决在使用 Qt 编译项目时出现 “C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode格式以防止数据丢失“ 的警告

    解决在使用 Qt 编译项目时出现 "C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode格式以防止数据丢失" 的警告 警告出现的原因:编 ...

  7. warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

    warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失 [问题描述] Qt项目使用 VC++ 编译器出现此错误. war ...

  8. Qt使用MSVC编译器关闭“warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失”警告的方法

    Qt使用MSVC编译器关闭"warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失"警告的方法 [问 ...

  9. 解决:测试HDFS读写性能时出现错误

    解决:测试HDFS读写性能时出现错误 今天测试HDFS的读写性能出现以下错误 java.lang.IllegalArgumentException:Unsupported ByteMultiple M ...

最新文章

  1. R语言基础练习与入门实践
  2. Kotlin应用开发初体验
  3. 用聪明的方式学习Vim,不再死记硬背,复杂命令一学就会 | GitHub 2200星
  4. 搭搭机器人科技活动中心怎么样_搭搭乐乐机器人怎么样?感受科技创收力量
  5. 滑块 组件_组件制作:如何使用链接的输入创建滑块
  6. 大数据-操作HDFS的基本命令
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的网上二手车交易系统
  8. JM代码阅读之一SODB RBSP EBSP NALU
  9. 信息论的基本概念和熵的计算
  10. 南京邮电大学计算机专业学费多少,南京邮电大学学费多少
  11. 用Form 表单认证实现单点登录(Single Sign On) 作者:寒羽枫(cityhunter172)
  12. DBF文件的初步了解(一)
  13. 苹果youtube无法连接网络_当手机无信号或者无法连接网络时的正确解决步骤
  14. 回溯算法--LeetCode-78 子集、LeetCode-90 子集Ⅱ
  15. AD的设计里面找不到生成PCB选项
  16. 基于视频的车辆检测文献综述
  17. linux飞鸽传书项目实训,Linux_信使(iptux):Linux下的飞鸽传书,不知你是否使用过“飞鸽传书 - phpStudy...
  18. 计算广告(1)---一些概念
  19. 漏洞复现之ms10_018
  20. 国产良心极简版地图软件,地图下载很丝滑,界面简洁无广告

热门文章

  1. 中小型数据库 RMAN CATALOG 备份恢复方案(一)
  2. 遍历寻找给定两点之间的所有路径
  3. CSS超出省略三个点
  4. Go singleflight
  5. 1411122215-ny-Financial Management
  6. SqlServer:sql添加外键约束
  7. MYSQL 10055错误解决方法
  8. 外企、国企、名企 笔记
  9. ubuntu下多用户ssh私有登录
  10. Full SDK 下载地址