未测试 Delphi读写UTF-8、Unicode格式文本文件
// 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格式文本文件相关推荐
- 创建Unicode格式的INI文件
前段时间由于开发一个软件,需要调用别人的接口,虽然我的软件是Unicode编码,对方的模块也是Unicode编码,但是对方提供的接口却是Ansi接口,在非中文系统下,由于涉及到中文路径,导致Ansi和 ...
- UTF、Unicode、ASCII及中文编码
一.Unicode缘起 Unicode是一种字符编码规范 . 1.国际标准ASCII编码 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits) ...
- linux测试磁盘读写能力
在平时的工作中,经常需要评估一些服务器的资源,磁盘IO是其中一个容易出现瓶颈的地方,那么我们通常需要预先知道该服务器上的磁盘IO能达到多少.在这里记录一下经常用到的一个用来测试磁盘读写能力的命令. 1 ...
- warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失...
从同事那里拷来两个头文件,一编译就出现了这个警告. 想要消除这个警告,几个方法: (1)转换Code文件为Unicode格式: (2)在Project -> Properties -> ...
- 统计“3_人民日报语料”文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式
统计"3_人民日报语料"文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式; 首先,统计文件的字符数,有两种方法.第一种是将文件复制到w ...
- 解决在使用 Qt 编译项目时出现 “C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode格式以防止数据丢失“ 的警告
解决在使用 Qt 编译项目时出现 "C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode格式以防止数据丢失" 的警告 警告出现的原因:编 ...
- warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失 [问题描述] Qt项目使用 VC++ 编译器出现此错误. war ...
- Qt使用MSVC编译器关闭“warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失”警告的方法
Qt使用MSVC编译器关闭"warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失"警告的方法 [问 ...
- 解决:测试HDFS读写性能时出现错误
解决:测试HDFS读写性能时出现错误 今天测试HDFS的读写性能出现以下错误 java.lang.IllegalArgumentException:Unsupported ByteMultiple M ...
最新文章
- R语言基础练习与入门实践
- Kotlin应用开发初体验
- 用聪明的方式学习Vim,不再死记硬背,复杂命令一学就会 | GitHub 2200星
- 搭搭机器人科技活动中心怎么样_搭搭乐乐机器人怎么样?感受科技创收力量
- 滑块 组件_组件制作:如何使用链接的输入创建滑块
- 大数据-操作HDFS的基本命令
- 基于JAVA+SpringMVC+Mybatis+MYSQL的网上二手车交易系统
- JM代码阅读之一SODB RBSP EBSP NALU
- 信息论的基本概念和熵的计算
- 南京邮电大学计算机专业学费多少,南京邮电大学学费多少
- 用Form 表单认证实现单点登录(Single Sign On) 作者:寒羽枫(cityhunter172)
- DBF文件的初步了解(一)
- 苹果youtube无法连接网络_当手机无信号或者无法连接网络时的正确解决步骤
- 回溯算法--LeetCode-78 子集、LeetCode-90 子集Ⅱ
- AD的设计里面找不到生成PCB选项
- 基于视频的车辆检测文献综述
- linux飞鸽传书项目实训,Linux_信使(iptux):Linux下的飞鸽传书,不知你是否使用过“飞鸽传书 - phpStudy...
- 计算广告(1)---一些概念
- 漏洞复现之ms10_018
- 国产良心极简版地图软件,地图下载很丝滑,界面简洁无广告