- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 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()
方法有一个可选的 TIdTextEncoding
或 IIdTextEncoding
该字符串<->字节转换的参数(取决于您的 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/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!