ut64字符串的base64编码

pei*_* F. 5 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;
Run Code Online (Sandbox Code Playgroud)

但utf-8输入的输出是错误的

orange  --> b3Jhbmdl  [correct]
book   --> Ym9vaw==   [correct]
????  -->  Pz8/Pw==   [wrong]
????  --> Pz8/Pw==   [wrong]
????  --> Pz8/Pw==   [wrong]
Run Code Online (Sandbox Code Playgroud)

对于所有输入的utf-8,它返回同样的输出!!! 我的代码有什么问题,我怎么能用utf-8字符串获得base64编码的好结果

Rem*_*eau 8

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

您正在传递一个UTF8Stringto EncodeString(),它UnicodeString在XE5中作为输入,因此RTL将UTF8String数据转换回UTF-16,撤消您的UTF8Encode()(不推荐使用,BTW).由于您没有指定字节编码,因此Indy使用其默认编码,默认情况下设置为ASCII(可通过单元中的GIdDefaultTextEncoding变量进行配置IdGlobal).

这就是orange工作(没有数据丢失)但????失败(数据丢失)的原因.

你需要UTF8String完全摆脱你,让Indy为你处理UTF-8:

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

DecodeString()具有类似的参数,用于指定已经base64编码的八位字节的字节编码.首先将输入解码为字节,然后UnicodeString使用指定的字节编码将字节转换为例如:

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


RRU*_*RUZ 5

您必须调用EncodeString传递正确字节编码类的方法。

尝试这个

m2.Text := TIdEncoderMIME.EncodeString(UTF8, IndyUTF8Encoding);
Run Code Online (Sandbox Code Playgroud)

(IndyUTF8Encoding在单元中定义IdGlobal

  • 不要首先将源“String”分配给“UTF8String”。将其按原样传递给 `EncodeString()` 并让 Indy 在内部将 `String` 转换为 UTF-8,然后将八位字节编码为 Base64: `m2.Text := TIdEncoderMIME.EncodeString(m1.Text, IndyUTF8Encoding); `。如果您使用的是 D2007 或更早版本,“EncodeString()”会采用一个附加参数,让您指定“String”的 Ansi 编码,以便“EncodeString()”可以将其正确转换为 UTF-8。另外仅供参考,在 Indy 10.6 中,“IndyUTF8Encoding”已被替换为“IndyTextEncoding_UTF8”。 (4认同)