Delphi 编码错误问题

开发工具:Delphi 10.2  

在工作中遇到一个问题,我需要将json类型的数据进行解析,代码如下:         JsonFile:=TStringList.Create;
        JsonFile.LoadFromFile(FileName);
        //  pageSize:=JSONFile.Text;
       Js.Parse(JSONFile.Text);

但是在调试执行Js.Parse(JSONFile.Text);这一行的时候报错了,于是添加了pageSize:=JSONFile.Text;这一行并打断点进行调试发现源文件中的中文字符变成了乱码,‘男’变成了‘鐢’。

于在网上查找原因,是因为GBK编码转UTF8编码时出现了错误,原因是utf-8中,一个字母用一个字节表示,一个汉字用三个字节表示,特殊的汉字用四个字节表示,而gbk中,一个字母用一个字节表示,一个汉字用两个字节表示。

我的解决办法如下:

把源文件编码格式改为UTF8,然后设置读取文件时候的格式为UTF8就行

关键源码如下(Stream是TFileStream类、Reader是TStreamReader类、ResultStr是string类型、Js是TQJson类):

Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
Reader := TStreamReader.Create(Stream, TEncoding.UTF8);
ResultStr := Reader.ReadToEnd;
Js.Parse(ResultStr);

能成功获取到正确的中文格式字符串

一个题外话:

在解决这个问题的时候,其实不太顺利,在找到错误原因是GBK编码转UTF8编码时出现了错误后,我的第一个想法是怎么将GBK编码的中文字符串正确转为UTF8编码的字符串。但是没有成功,不过好像我的这个函数是对的成功的,在网上找了很久没有找到相关的源码,于是分享出来,有需要的可以拿去试试。如下代码,可以将GBK编码的字符串转为UTF8编码的字符串:

function GBKtoUFT8(GBKStr:string):string;
var
  UTF8Str: TBytes;
  UTF8Bytes:TBytes;
  GBKEncoding: TEncoding;
  UTF8Encoding: TEncoding;
begin
//  GBKStr := '哈哈哈哈啊哈,终于转成功啦呵呵哈哈哈hhh111,haokaixin jiangli yipian boke';

  // 将GBK编码的字符串转换为字节流
  GBKEncoding := TEncoding.GetEncoding('GBK');
  UTF8Str := GBKEncoding.getBytes(GBKStr);

  // 将UTF-8编码的字节流转换为字符串
//  bytes := TEncoding.UTF8.GetBytes(UTF8Str);
  UTF8Encoding := TEncoding.UTF8;
  UTF8Bytes := UTF8Encoding.GetBytes(GBKEncoding.GetString(UTF8Str));
  result:= UTF8Encoding.GetString(UTF8Bytes);
end;

相关推荐

  1. Delphi 编码错误问题

    2023-12-06 12:28:01       38 阅读
  2. c#调用Delphi编写DLL

    2023-12-06 12:28:01       8 阅读
  3. delphi11】delphi进阶【六、数据库编程

    2023-12-06 12:28:01       41 阅读
  4. Delphi 的 SuperObject 解析和编码 Json 字符串的示例

    2023-12-06 12:28:01       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-06 12:28:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-06 12:28:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-06 12:28:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-06 12:28:01       18 阅读

热门阅读

  1. ffmpeg在centos系统下的源文件下载脚本及编译脚本

    2023-12-06 12:28:01       40 阅读
  2. linux 中vmalloc实现简述

    2023-12-06 12:28:01       34 阅读
  3. 6、Broker消息处理流程(六)

    2023-12-06 12:28:01       31 阅读
  4. Hadoop学习笔记(HDP)-Part.01 关于HDP

    2023-12-06 12:28:01       33 阅读
  5. 云架构的思考1--云计算有什么不同,为什么上云

    2023-12-06 12:28:01       30 阅读
  6. pytorch学习3-torchvisin和Dataloader的使用

    2023-12-06 12:28:01       37 阅读
  7. Linux 环境部署RabbitMQ

    2023-12-06 12:28:01       37 阅读
  8. Redux,react-redux,dva,RTK

    2023-12-06 12:28:01       40 阅读
  9. 【蓝桥杯】马的遍历

    2023-12-06 12:28:01       17 阅读