我有 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/