use*_*348 5 delphi base64 decode utf8-decode delphi-xe7
在Delphi XE7 Update 1中,尝试在VCL程序中执行此代码时:
uses System.NetEncoding;
...
tempstring := TNetEncoding.Base64.Decode(tempstring);
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:

那么如何使用NetEncoding对字符串进行base64解码呢?
您正在调用Decode接受base64编码文本的重载并返回一个字符串.该Decode方法的实现方式如下:
您的错误消息表明步骤1产生的二进制文件无效UTF-8.为了弄清楚为什么需要知道base64编码文本的来源.
您当前的代码假定发生了以下过程来创建base64编码值:
问题不一定在你的代码中解码.问题是您的解码与最初编码的进程不匹配.故障可能在于原始编码或解码.您需要检查base64值的编码方式.是使用上述步骤编码的吗?
如果我不得不猜测,我会怀疑原始数据实际上不是文本的.我的猜测是原始数据是二进制的,即一个字节流.我怀疑你是从一些在AnsiString变量中保存二进制数据的代码开始的.看到Delphi代码以这种方式滥用字符串是很常见的.由于历史原因,似乎已经写入了AnsiString可用于保存二进制数据的知识.我想这一切都是在Delphi 2推出时开始的AnsiString,当时没有动态数组.
无论如何,如果你以前一直AnsiString用来保存二进制数据,那么你应该抓住这个机会停止这样做.使用TBytes,例如,用于这一目的.在这种情况下,您将使用:
var
bytes: TBytes;
....
bytes := TNetEncoding.Base64.DecodeStringToBytes(...);
Run Code Online (Sandbox Code Playgroud)
将base64值解码为二进制.
因此,假设您拥有的base64实际上是ANSI编码的文本.然后你会像这样解码它:
var
bytes: TBytes;
text: string;
....
bytes := TNetEncoding.Base64.DecodeStringToBytes(...);
text := TEncoding.ANSI.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)
这假定您解码的机器上的主要ANSI代码页.如果您需要指定ANSI代码页,那么您可以像这样编写它:
var
bytes: TBytes;
text: string;
Encoding: TEncoding;
....
bytes := TNetEncoding.Base64.DecodeStringToBytes(...);
Encoding := TEncoding.GetEncoding(CodePage);
try
text := Encoding.GetString(bytes);
finally
Encoding.Free;
end;
Run Code Online (Sandbox Code Playgroud)
如你所见,我现在沦为猜测.如果您想取得进展,您将了解数据的编码方式.