gpt4 book ai didi

delphi - 从 JSON 文件中解码 UTF-8

转载 作者:行者123 更新时间:2023-12-02 05:46:37 24 4
gpt4 key购买 nike

我有一个 JSON 文件,其中包含表示 JPG 内容的编码 UTF-8 字符串字段:

"ImageData": "ÿØÿà\u0000\u0010JFIF\u0000\u0001\u0002\u0000\u0000d\u0000d\u0000\u0000

我正在解析 JSON 并获取该值:

var imageString : string;
...
imageString:=jv.GetValue<string>('ImageData');

但是我在解码字节并将其保存到文件时遇到问题

选项 1.SaveBytesToFile(BytesOf(imageString),pathFile);

如您所见,标题不正确(应以 ÿØÿà 开头)

option1

选项 2.SaveBytesToFile(TEncoding.UTF8.GetBytes(imageString),pathFile);

与选项 1 类似的问题

option2

SaveBytesToFile 的代码:

procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
try
if length(data) > 0 then
stream.WriteBuffer(data[0], length(data));
stream.SaveToFile(FileName);
finally
stream.Free;
end;
end;

如何正确解码?

最佳答案

JSON 是一种纯文本格式,它根本没有处理二进制数据的规定。为什么图像字节没有以文本兼容的格式编码,例如 base64 , base85 , base91 , ETC?否则,请使用类似 BSON 的内容(二进制 JSON)或 UBJSON (通用二进制 JSON),两者都支持二进制数据。

无论如何,BytesOf() 都会损坏字节,因为它使用用户的默认区域设置(通过 TEncoding.Default,在非 Windows 上为 UTF-8)平台!),因此 ASCII 范围之外的字符会受到区域设置解释的影响,并且不会生成您需要的字节。

在您的情况下,请确保 JSON 库将 JSON 文件解码为 UTF-8,然后您可以简单地循环生成的字符串(JSON 库应该为您将转义序列解析为字符)并截断字符按原样转换为 8 位值。根本不执行任何类型的字符集转换。例如:

var
imageString : string;
imageBytes: TBytes;
i: Integer;
...
begin
...

imageString := jv.GetValue<string>('ImageData');

SetLength(imageBytes, Length(imageString));
for i := 0 to Length(imageString)-1 do begin
imageBytes[i] := Byte(imageString[i+1]);
end;

SaveBytesToFile(imageBytes, pathFile);

...
end;

image

顺便说一句,您的 SaveBytesToFile() 可以大大简化,而不会浪费内存来复制 TBytes:

procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
stream: TBytesStream;
begin
stream := TBytesStream.Create(Data);
try
stream.SaveToFile(FileName);
finally
stream.Free;
end;
end;

或者:

procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
stream: TFileStream;
begin
stream := TFileStream.Create(FileName, fmCreate);
try
stream.WriteBuffer(PByte(Data)^, Length(Data));
finally
stream.Free;
end;
end;

或者:

uses
..., System.IOUtils;

procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
begin
System.IOUtils.TFile.WriteAllBytes(FileName, Data);
end;

关于delphi - 从 JSON 文件中解码 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55715634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com