zoukankan      html  css  js  c++  java
  • delphi如何保存和读取utf8的文本文件

    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的文本文件

  • 相关阅读:
    C#通过正则表达式统计词频的一个方法
    本地服务器远程连接其它数据库
    拼字符串成为时间,和两个计算时间点的中间值
    删除文件夹里的图片,打印删除日志
    行转列SQL语句
    加载出一个有层次的下拉框
    查询结果列传行
    【Java&Python双管齐下复健002】回文数和反转数
    【Java&Python双管齐下复健001】冒泡排序和质数判断
    【LeetCode记录】初级算法:数组之删除排序数组中的重复项
  • 原文地址:https://www.cnblogs.com/python001/p/4306563.html
Copyright © 2011-2022 走看看