我正在 Delphi XE5 中开发 android 应用程序,我需要 BASE64 编码和解码一些字符串。
这个函数对于英文字符工作正常,但是我想要编码 €、$ 或任何特殊的 iso8859-2 字符编码不起作用。
知道如何修复它吗?
我找到了 BASE64 单元http://www.delphipraxis.net/991-base64-mime-en-decoding.html http://www.delphipraxis.net/991-base64-mime-en-decoding.html
但是 FireMonkey 是否支持 AnsiString 和 PAnsiChar 类型以及要包含哪些单元才能使用该类型?
My code
uses IdCoderMIME;
...
function Encode64(S: string): string;
var
IdEncoderMIME: TIdEncoderMIME;
begin
try
IdEncoderMIME := TIdEncoderMIME.Create(nil);
Result := IdEncoderMIME.EncodeString(S);
finally
IdEncoderMIME.Free;
end;
end;
function Decode64(S: string): string;
var
IdDecoderMIME: TIdDecoderMIME;
var
IdDecoderMIME: TIdDecoderMIME;
begin
try
IdDecoderMIME := TIdDecoderMIME.Create(nil);
Result := IdDecoderMIME.DecodeString(S);
finally
IdDecoderMIME.Free;
end;
end;
关键点在于,base64 是字节数组到文本的编码。因此,如果您希望对文本进行编码,则必须首先将文本转换为字节数组。为此,您需要选择特定的文本编码。
举例来说,我们假设您的文本编码是 UTF-8。将文本编码为 Base64 的过程如下所示:
- 使用 UTF-8 编码将纯文本编码为字节数组。
- 将该字节数组编码为 Base64 字符串。
相反的方向是这样的:
- 将 base64 字符串解码为字节数组。
- 使用 UTF-8 编码将字节数组解码为字符串。
Delphi 附带了可以执行所有这些步骤的库。这TEncoding
类处理 UTF-8 部分,并且Soap.EncdDecd
单位做base64。这里不需要仅仅使用Indy来进行base64编码。
不幸的是EncodeString
and DecodeString
功能于Soap.EncdDecd
没有正确处理 Unicode https://stackoverflow.com/questions/21883152/。我更喜欢避免它们并使用EncodeStream
and DecodeStream
功能。像这样:
uses
System.SysUtils, System.Classes, Soap.EncdDecd;
function EncodeString(const Input: string): string;
var
InStr, OutStr: TStringStream;
begin
InStr := TStringStream.Create(Input, TEncoding.UTF8);
try
OutStr := TStringStream.Create('');
try
EncodeStream(InStr, OutStr);
Result := OutStr.DataString;
finally
OutStr.Free;
end;
finally
InStr.Free;
end;
end;
function DecodeString(const Input: string): string;
var
InStr, OutStr: TStringStream;
begin
InStr := TStringStream.Create(Input);
try
OutStr := TStringStream.Create('', TEncoding.UTF8);
try
DecodeStream(InStr, OutStr);
Result := OutStr.DataString;
finally
OutStr.Free;
end;
finally
InStr.Free;
end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)