zoukankan      html  css  js  c++  java
  • Delphi读取和写入utf-8编码格式的文件

    读取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;

    写入UTF-8编码格式的文件

    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;

    利用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;
  • 相关阅读:
    iOS网络编程开发-数据加密
    iOS网络编程开发GET请求和POST请求
    iOS网络编程开发—HTTP协议
    iOS网络编程开发—网络编程基础
    iOS多线程技术—自定义NSOperation
    iOS多线程技术—NSOperation用法
    大家一起和snailren学java-(一)对象导论
    大家一起和snailren学java-(序)
    Hadoop 2.7.0模拟分布式实验环境搭建[亲测]
    LeetCode:103Binary Tree Zigzag Level Order Traversal
  • 原文地址:https://www.cnblogs.com/blogpro/p/11339729.html
Copyright © 2011-2022 走看看