gpt4 book ai didi

android - BASE64 编码和解码不起作用

转载 作者:太空狗 更新时间:2023-10-29 15:38:29 31 4
gpt4 key购买 nike

我正在使用 Delphi XE5 开发 android 应用程序,我需要对一些字符串进行 BASE64 编码和解码。

此函数对英文字符工作正常,但我想要编码 €、$ 或任何特殊的 iso8859-2 字符编码不起作用。

知道如何解决吗?

我找到了 BASE64 单元 http://www.delphipraxis.net/991-base64-mime-en-decoding.html

但是 FireMonkey 是否支持 AnsiString 和 PAnsiChar 类型以及要包含什么单元才能使用这种类型?

我的代码

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;

最佳答案

官方,Delphi 在移动平台上支持AnsiString(P)AnsiChar非官方,它们的支持代码仍然存在于编译器和 RTL 中,它只是隐藏起来,因此您无法再访问它。有一个 third-party patch可重新启用访问权限。

编码/解码字符串时,必须考虑字符编码。 Base64 编码字节,而不是字符。您必须先将字符串转换为字节序列,然后对字节进行 Base64 编码,然后对字节序列进行 Base64 解码,然后再将其转换回字符串。

TIdEncoderMIME.EncodeString()TIdDecoderMIME.DecodeString() 方法有一个可选的 TIdTextEncodingIIdTextEncoding该字符串<->字节转换的参数(取决于您的 Indy 版本)。如果您不指定文本编码,Indy 将使用其默认文本编码,默认情况下为 7 位 ASCII(可通过 IdGlobal.GIdDefaultTextEncoding 变量配置)。

例如:

uses
..., IdGlobal, IdCoderMIME;

function Encode64(const S: string: const ByteEncoding: IIdTextEncoding = nil): string;
begin
Result := TIdEncoderMIME.EncodeString(S, ByteEncoding);
end;

function Decode64(const S: string: const ByteEncoding: IIdTextEncoding = nil): string;
begin
Result := TIdDecoderMIME.DecodeString(S, ByteEncoding);
end;

uses
..., IdGlobal;

var
s, base64: string;
begin
s := '€$';
base64 := Encode64(s, IndyTextEncoding_UTF8);
s := Decode64(base64, IndyTextEncoding_UTF8);
end;

uses
..., IdGlobal;

var
s, base64: string;
enc: IIdTextEncoding;
begin
enc := IndyTextEncoding(28592); // ISO-8859-2
s := '€$';
base64 := Encode64(s, enc);
s := Decode64(base64, enc);
end;

uses
..., IdGlobal, IdGlobalProtocols;

var
s, base64: string;
enc: IIdTextEncoding;
begin
enc := CharsetToEncoding('ISO-8859-2');
s := '€$';
base64 := Encode64(s, enc);
s := Decode64(base64, enc);

关于android - BASE64 编码和解码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22026825/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com