delphi如何保存和读取utf8的文本文件

摘要:
delphi如何保存和读取utf-8的文本文件原文来自:100脚本网delphi保存读取utf-8的文本文件给客户做了一个批量识别图像并合成双层pdf的程序,最后客户需要生成的同时附带一份记事本文件,就是OCR过后的文本,并指定utf-8格式的。找了半天问题最后终于发现问题出现在声明的参数WideString上,改成string就没问题了。

delphi如何保存和读取utf-8的文本文件

原文来自: 100脚本网

delphi保存读取utf-8的文本文件
给客户做了一个批量识别图像并合成双层pdf的程序,最后客户需要生成的同时附带一份记事本文件,就是OCR过后的文本,并指定utf-8格式的。在处理utf-8时出现了点小问题,现在总结如下

首先 利用delphi自带的UTF8Encode函数,将普通字符转换为utf-8编码

创建一个流,MemoryStream或FileStream都可

函数看起来如下

引用
procedure SaveUTF8File(AContent:WideString;AFileName: string);
var
ffileStream:TFileStream;
futf8Bytes: string;
S: string;
begin
ffileStream:=TFileStream.Create(AFileName,fmCreate);
futf8Bytes:= UTF8Encode(AContent);
ffileStream.Write(futf8Bytes[1],Length(futf8Bytes));
ffileStream.Free;
end;

运行后查看生成的文件,全是乱码,上网搜索发现

unicode文本文件:头两个字符分别是FF FE(16进制)
utf-8文本文件:头两个字符分别是EF BB(16进制)

原来是忘了把文件头加进去了

于是加入代码后

引用
procedure SaveUTF8File(AContent:WideString;AFileName: string);
var
ffileStream:TFileStream;
futf8Bytes: string;
S: string;
begin
ffileStream:=TFileStream.Create(AFileName,fmCreate);
futf8Bytes:= UTF8Encode(AContent);
S:=#$EF#$BB#$BF;
ffileStream.Write(S[1],Length(S));
ffileStream.Write(futf8Bytes[1],Length(futf8Bytes));
ffileStream.Free;
end;

保存文件后查看,还是乱码。找了半天问题最后终于发现问题出现在声明的参数WideString上,改成string就没问题了。

最后生成 的代码如下

引用
procedure SaveUTF8File(AContent:string;AFileName: string);
var
ffileStream:TFileStream;
futf8Bytes: string;
S: string;
begin
ffileStream:=TFileStream.Create(AFileName,fmCreate);
futf8Bytes:= UTF8Encode(AContent);
S:=#$EF#$BB#$BF;
ffileStream.Write(S[1],Length(S));
ffileStream.Write(futf8Bytes[1],Length(futf8Bytes));
ffileStream.Free;
end;

再附上一段读取utf-8文本的代码

引用
function LoadUTF8File(AFileName: string): string;
var
ffileStream:TFileStream;
fAnsiBytes: string;
S: string;
begin
ffileStream:=TFileStream.Create(AFileName,fmOpenRead);
SetLength(S,ffileStream.Size);
ffileStream.Read(S[1],Length(S));
fAnsiBytes:= UTF8Decode(Copy(S,4,MaxInt));
Result:= fAnsiBytes;
end;

delphi如何保存和读取utf-8的文本文件

免责声明:文章转载自《delphi如何保存和读取utf8的文本文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NFS挂载失败,报No route to hostcss边框内凹圆角,解决优惠券的边框问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

阿里云OSS存储

1.accessKeyId与accessKeySecret是由系统分配给用户的,称为ID对,用于标识用户,为访问OSS做签名验证。 2.Bucket是OSS上的命名空间,相当于数据的容器,可以存储若干数据实体(Object) 你可以按照下面的代码新建一个Bucket: /// <summary> /// 新建...

ICE3.7.3集群安装与部署

ICE3.7.3集群安装与部署前言: 本文ice3.7.3基于ubuntu16.04版安装,如果版本不一致可能造成离线安装包缺少依赖或者依赖版本过低或过高的问题,需要重新下载安装包。本安装包包含openjdk_1.8.0_242无需自己下载安装。 准备五台ubuntu16.04(三台也可以)icegrid-master、icegrid-slave、node...

Kubernetes (yaml 文件详解)

# yaml格式的pod定义文件完整内容:apiVersion: v1       #必选,版本号,例如v1kind: Pod       #必选,Podmetadata:       #必选,元数据  name: string       #必选,Pod名称  namespace: string    #必选,Pod所属的命名空间  labels:   ...

Nginx实现JWT验证-基于OpenResty实现

介绍 权限认证是接口开发中不可避免的问题,权限认证包括两个方面 接口需要知道调用的用户是谁 接口需要知道该用户是否有权限调用 第1个问题偏向于架构,第2个问题更偏向于业务,因此考虑在架构层解决第1个问题,以达到以下目的 所有请求被保护的接口保证是合法的(已经认证过的用户) 接口可以从请求头中获取当前用户信息 每个请求都有uuid用于标识 JWT(J...

dubbo

目录 java spi dubbo扩展机制spi 注册中心 RegistryService Registry RegistryFactory NotifyListener AbstractRegistry FailbackRegistry zookeeper注册中心ZookeeperRegistry 远程通信 Transporter Ex...

Java多线程:向线程传递参数的三种方法

在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据。本文就以上原因介绍了几种用于向线程传递数据的方法...