【问题标题】:Delphi 10.1 No mapping for unicode character exists in target multi-byte code pageDelphi 10.1 目标多字节代码页中不存在 unicode 字符的映射
【发布时间】:2019-03-04 04:31:07
【问题描述】:

我正在尝试解码 base64 字符串

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

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

【问题讨论】:

  • 您显示的base64在解码时不包含任何有意义的文本,而是二进制数据。那么是什么让您认为您可以将其解码为字符串呢?
  • 您可以检查在线 base64 解码器以查看您的示例不是有效的 UTF 文本。 base64decode.org

标签: delphi base64 delphi-10.1-berlin


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-11-21
    • 2017-03-21
    • 2013-08-14
    • 2014-08-05
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多