gpt4 book ai didi

delphi - utf-8字符串的base64编码

转载 作者:行者123 更新时间:2023-12-03 15:04:43 33 4
gpt4 key购买 nike

我有 rad studio xe5我使用 indy EncodeString 对输入字符串进行编码...

我的代码是这样的:

procedure TForm5.Button2Click(Sender: TObject);
var
UTF8: UTF8String;
begin
UTF8 := UTF8Encode(m1.Text);
m2.Text := ind.EncodeString(UTF8);
end;

但是对于 utf-8 输入,输出是错误的

orange  --> b3Jhbmdl  [correct]
book --> Ym9vaw== [correct]
سلام --> Pz8/Pw== [wrong]
کتاب --> Pz8/Pw== [wrong]
دلفی --> Pz8/Pw== [wrong]

对于 utf-8 的所有输入,它返回相同的输出!我的代码有什么问题以及如何使用 utf-8 字符串进行 Base64 编码获得良好的结果

最佳答案

就像@RRUZ所说,EncodeString()希望您指定输入String将转换为的字节编码,然后这些八位字节将被编码为base64 .

您将 UTF8String 传递给 EncodeString(),它采用 UnicodeString 作为 XE5 中的输入,因此 RTL 将转换 UTF8String 数据返回 UTF-16,撤消您的 UTF8Encode() (顺便说一句,该方法已弃用)。由于您没有指定字节编码,Indy 使用其默认编码,默认设置为 ASCII(可通过 IdGlobal 单元中的 GIdDefaultTextEncoding 变量进行配置)。

这就是为什么 orange 可以工作(没有数据丢失),但 การ่รก 失败(数据丢失)的原因。

您需要完全删除 UTF8String,并让 Indy 为您处理 UTF-8:

procedure TForm5.Button2Click(Sender: TObject);
begin
m2.Text := TIdEncoderMIME.EncodeString(m1.Text, IndyTextEncoding_UTF8);
end;

DecodeString() 有一个类似的参数,用于指定已进行 Base64 编码的八位字节的字节编码。输入首先被解码为字节,然后使用指定的字节编码将字节转换为 UnicodeString,例如:

procedure TForm5.Button3Click(Sender: TObject);
begin
m1.Text := TIdDecoderMIME.DecodeString(m2.Text, IndyTextEncoding_UTF8);
end;

关于delphi - utf-8字符串的base64编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22212779/

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