ut64字符串的base64编码

时间:2014-03-06 01:05:41

标签: 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编码的好结果

3 个答案:

答案 0 :(得分:8)

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

您正在将UTF8String传递给EncodeString(),在XE5中输入UnicodeString,因此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;

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

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

答案 1 :(得分:4)

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

试试这个

m2.Text := TIdEncoderMIME.EncodeString(UTF8, IndyUTF8Encoding);

(IndyUTF8Encoding在IdGlobal单位中定义)

答案 2 :(得分:1)

对于RadStudio10 C ++

#include <IdGlobal.hpp> String my_str = L"Շնորհակալություն"; String str = IdEncoderMIME1->EncodeString(my_str ,IndyTextEncoding_UTF8()); my_str = IdDecoderMIME1->DecodeString(str ,IndyTextEncoding_UTF8());

相关问题