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"。
我做错了什么?
您的代码示例不完整,但我只能假设 DecodeString
是 Soap.EncdDecd
的函数。鉴于该假设,对 DecodeString
的调用确实会引发您描述的异常。
异常是由一个非常普遍的误解引起的,即二进制数据和文本数据可以互换。当您调用 DecodeString
时,您实际上是在要求进行两项操作:
- 将 base64 数据解码为二进制,即字节数组。
- 将此二进制数据解释为 UTF-8 编码文本,并解码为本机 Delphi 字符串。
第一个操作成功,因为 base64 数据有效。第二个操作失败,因为二进制数据不是有效的 UTF-8 编码文本。
您很可能犯了一个错误,虽然很常见,但想将二进制数据(字节数组)视为字符串。字符串与字节数组不同。
你有二进制数据,所以这样处理:
uses
System.NetEncoding;
var
base64: string;
bytes: TBytes;
....
base64 := 'MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECO9X2Lfq3EYMBBiX0/4McWT3y6hWMvOJvH5MwD22EOvPbLQ=';
bytes := TNetEncoding.Base64.DecodeStringToBytes(base64);
我正在尝试解码 base64 字符串
Sample:='MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECO9X2Lfq3EYMBBiX0/4McWT3y6hWMvOJvH5MwD22EOvPbLQ=';
Result:=DecodeString(Sample);
出现错误:"No mapping for unicode character exists in target multi-byte code page"。 我做错了什么?
您的代码示例不完整,但我只能假设 DecodeString
是 Soap.EncdDecd
的函数。鉴于该假设,对 DecodeString
的调用确实会引发您描述的异常。
异常是由一个非常普遍的误解引起的,即二进制数据和文本数据可以互换。当您调用 DecodeString
时,您实际上是在要求进行两项操作:
- 将 base64 数据解码为二进制,即字节数组。
- 将此二进制数据解释为 UTF-8 编码文本,并解码为本机 Delphi 字符串。
第一个操作成功,因为 base64 数据有效。第二个操作失败,因为二进制数据不是有效的 UTF-8 编码文本。
您很可能犯了一个错误,虽然很常见,但想将二进制数据(字节数组)视为字符串。字符串与字节数组不同。
你有二进制数据,所以这样处理:
uses
System.NetEncoding;
var
base64: string;
bytes: TBytes;
....
base64 := 'MEIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECO9X2Lfq3EYMBBiX0/4McWT3y6hWMvOJvH5MwD22EOvPbLQ=';
bytes := TNetEncoding.Base64.DecodeStringToBytes(base64);