Delphi10.1 目标多字节代码页中不存在 unicode 字符的映射

Delphi 10.1 No mapping for unicode character exists in target multi-byte code page

我正在尝试解码 base64 字符串

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

出现错误:"No mapping for unicode character exists in target multi-byte code page"。 我做错了什么?

您的代码示例不完整,但我只能假设 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);