Delphi 10.1 В целевой многобайтовой кодовой странице нет сопоставления для символа Юникод - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь декодировать строку base64

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

Получена ошибка: «В целевой многобайтовой кодовой странице нет сопоставления для символа Юникод».Что я делаю не так?

1 Ответ

0 голосов
/ 04 марта 2019

Ваш пример кода неполон, но я могу только предположить, что 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);
...