Delphi 10.1目标多字节代码页中不存在Unicode字符的映射

时间:2019-03-04 04:31:08

标签: delphi base64 delphi-10.1-berlin

我正在尝试解码base64字符串

Sample:='MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECO9X2Lfq3EYMBBiX0/4McWT3y6hWMvOJvH5MwD22EOvPbLQ=';
Result:=DecodeString(Sample);

出现错误:“目标多字节代码页中不存在Unicode字符的映射”。 我在做什么错了?

1 个答案:

答案 0 :(得分:3)

您的代码示例不完整,但是我只能假设DecodeStringSoap.EncdDecd中的函数。在这种假设下,对DecodeString的调用确实会引发您所描述的异常。

该异常是由一个非常普遍的误解引起的,即二进制和文本数据是可互换的。当您致电DecodeString时,实际上是在进行两项操作:

  1. 将base64数据解码为二进制(即字节数组)。
  2. 将此二进制数据解释为UTF-8编码的文本,并解码为本地Delphi字符串。

因为base64数据有效,所以第一个操作成功。第二个操作失败,因为二进制数据不是有效的UTF-8编码文本。

很可能是您犯了错误,尽管很常见,但是却想将二进制数据(字节数组)视为字符串。字符串和字节数组不是同一回事。

您拥有二进制数据,因此应将其视为这样:

uses
  System.NetEncoding;

var
  base64: string;
  bytes: TBytes;
....
base64 := 'MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECO9X2Lfq3EYMBBiX0/4McWT3y6hWMvOJvH5MwD22EOvPbLQ=';
bytes := TNetEncoding.Base64.DecodeStringToBytes(base64);