我有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
to 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;
DecodeString()
具有类似的参数,用于指定已经base64编码的八位字节的字节编码.首先将输入解码为字节,然后UnicodeString
使用指定的字节编码将字节转换为例如:
procedure TForm5.Button3Click(Sender: TObject); begin m1.Text := TIdDecoderMIME.DecodeString(m2.Text, IndyTextEncoding_UTF8); end;