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

标签 delphi encoding utf-8

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

相关文章:

delphi - 项目构建配置的上下文菜单中的 "Make"和 "Build"有什么区别?

Delphi Synapse UDP 客户端/服务器

delphi - 如何为所有 IDE 版本开发和测试组件?

Delphi本地网络应用程序

http - 发送特殊字符作为消息;

c# - 如何使用 UTF-8 以外的代码页在 C# 中写出文本文件?

java - Eclipse 假设错误的编码并更改了所有项目文件的编码

c# - 如何从 txt 文件中正确读取瑞典语字符

java - Base64编码: Illegal base64 character 3c

java - 文件编码的默认字符集 - Java