// 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[], );
end; S := AnsiToUtf8(S);
MemStream.Write(S[], Length(S));
MemStream.Position := ; 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, );
MemStream.Read(HeaderStr[], ); if HeaderStr = #$EF#$BB#$BF then
begin
SetLength(S, MemStream.Size - );
MemStream.Read(S[], MemStream.Size - );
end;
end else
begin
SetLength(S, MemStream.Size);
MemStream.Read(S[], 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[], );
end; WStr := WideString(S);
MemStream.Write(WStr[], Length(WStr)*);
MemStream.Position := ;
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, );
MemStream.Read(FlagStr[], ); if FlagStr = #$FF#$FE then
begin
SetLength(WStr, (MemStream.Size-) div );
MemStream.Read(WStr[], MemStream.Size - );
end;
end else
begin
SetLength(WStr, MemStream.Size div );
MemStream.Read(WStr[], 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;
type
TTextFormat=(tfAnsi,tfUnicode,tfUnicodeBigEndian,tfUtf8);
const
TextFormatFlag:array[tfAnsi..tfUtf8] of word=($,$FFFE,$FEFF,$EFBB);  function WordLoHiExchange(w:Word):Word;register;
asm
XCHG AL, AH
end; { 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,);
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,);//这里要注意一下,UFT-8必须要跳过三个字节。
TextFormat:=tfUtf8;
end else
begin
TextFormat:=tfANSI;
Position:=;
end;
SetLength(sText,Size-Position);
ReadBuffer(sText[],Size-Position);
finally
Free;
end;
end;

未测试 Delphi读写UTF-8、Unicode格式文本文件的更多相关文章

  1. Delphi读写UTF-8、Unicode格式文本文件

    // UTF-8文件写入函数procedure SaveUTFFile(const FileName: string; S: string; WriteHeader: Boolean = True); ...

  2. 创建Unicode格式的INI文件

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

  3. delphi读写INI系统配置文件

    delphi读写INI系统配置文件 一.调用delphi内建单元 uses System.IniFiles; .使用类TIniFile .类TIniFile的主要方法和函数: {$IFDEF MSWI ...

  4. 联盛德 HLK-W806 (十三): 运行FatFs读写FAT和exFat格式的SD卡/TF卡

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  5. 【转】warning C4819,该文件保存为 Unicode 格式以防止数据丢失,处理方法

    以下的解决方案只是把错误给屏蔽掉而已,并不能真正解决这个警告.仅供参考! 当项目引用到外部源代码后,经常出现4819错误,警告信息如下: warning C4819: 该文件包含不能在当前代码页(93 ...

  6. delphi读写文本文件

    delphi读写文本文件   在工作中遇到了这样一个问题,使用PLSQL将一个表的数据转化成一些列的insert语句存储到一个.sql文本中,我本来想使用access数据库中的查询视图一次执行这些语句 ...

  7. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式转换为Unicode格式

    Qt使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec ...

  8. C++ primer学习记录(个人猜想未测试版本)

    学习版本:第五版. 本博文主要记录个人曾经并不知晓知识细节. 因为linux下的编译环境还未进行学习.所以实际代码测试将在今后完成. 红色:需确认. 蓝色:重点. 1)const对象设定为仅在文件内有 ...

  9. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换

    t使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec类 ...

随机推荐

  1. vi 详解

    1.vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode).插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下: ...

  2. 机器学习6—SVM学习笔记

    机器学习牛人博客 机器学习实战之SVM 三种SVM的对偶问题 拉格朗日乘子法和KKT条件 支持向量机通俗导论(理解SVM的三层境界) 解密SVM系列(一):关于拉格朗日乘子法和KKT条件 解密SVM系 ...

  3. windows_64下python下载安装Numpy、Scipy、matplotlib模块

    本文应用的python3.6.3及其对应的Numpy.Scipy.matplotlib计算模块的cp36版本,其中Numpy是需要MKL版本的Numpy,这是后续安装Scipy的需要(本机系统win7 ...

  4. Smart pointer 智能指针小总结

    Smart pointer line 58之后smart pointer里的计数已经是0,所以会真正释放它引用的对象,调用被引用对象的析构函数.如果继续用指针访问,会出现如下图的内存访问异常.所以说如 ...

  5. java 性能检测工具 检测死锁等

    死锁检测方法 1 JConsole 找到需要查看的进程,打开线程选项卡,点击检测死锁 2 jps查看java进程ID,使用jstack  7412输出信息 3 使用jvisualvm连接java虚拟机 ...

  6. 微信小程序之云开发一

    最近听说微信小程序发布了云开发,可以不需要购买服务器,就能开发小程序和发布小程序,对于动辄千元的服务器,极大的节约了开发成本,受不住诱惑,我就开始了小程序的云开发,目前项目已上线,亲测不收费,闲不住的 ...

  7. 在UIWebView中设置cookie

     本文转载至 http://blog.csdn.net/chengyakun11/article/details/8863878 项目中,需要在打开3g网页时,通过cookie传递一些信息. 实现代码 ...

  8. Jmeter查看QPS和响应时间随着时间的变化曲线

    以下两个插件提供测试结果,扩展图表显示 --- Response Times Over Time --- Transactions per Second 1.打开 https://jmeter-plu ...

  9. vim对光标所在的数字进行增减

    真是vim会在不经意间给你惊喜...... 现在发现把光标移到某数字的上方,c-a是加1, c-x是减1 当时真有点众里寻他千百度的感觉

  10. lua面向对象封装

    lua面向对象的一个封装,直接贴代码 --swfclass = {};local cs = {};function _class( child, base, ... )--    _.s( child ...