Я получаю сообщение об ошибке с методом urldecode - PullRequest
0 голосов
/ 09 марта 2020

Я получаю следующую ошибку при декодировании кодированных в url символов методом TNetEncoding.URL.Decode():

Нет сопоставления для символа Unicode в целевой многобайтовой кодовой странице

Параметры URL:

?call=ExportEventPerspectiveAsCSV&min=2020-03-09%2000:00:00&max=2020-03-09%2023:59:59&type=csv&folder=%F6%E7

Мой код:

var
  Str: TStringList;
begin
  Str:= TStringList.Create();
  Str.Text := TNetEncoding.URL.Decode(ARequestInfo.QueryParams);// URLDecode(Str.Text);
  Str.Text := StringReplace(Str.Text, '&', #13, [rfReplaceAll]);
end;

1 Ответ

1 голос
/ 10 марта 2020

По умолчанию TNetEncoding.URL декодирует закодированную последовательность байтов как UTF-8, однако %F6%E7 не представляет действительную последовательность байтов UTF-8, поэтому она не может быть декодирована как UTF-8, поэтому "нет" mapping "error.

Вам необходимо указать правильную кодировку кодировки (которую вы должны будете выяснить, какой она должна быть в этой ситуации) в необязательном параметре AEncoding TURLEncoding.Decode() , например:

var
  Str: TStringList;
  Enc: TEncoding;
begin
  Str := TStringList.Create;
  try
    Enc := TEncoding.GetEncoding('TheCharsetHere'); // <-- !!!
    try
      Str.Text := TNetEncoding.URL.Decode(ARequestInfo.QueryParams, [TDecodeOption.PlusAsSpaces], Enc);
    finally
      Enc.Free;
    end;
    Str.Text := StringReplace(Str.Text, '&', #13, [rfReplaceAll]);
  finally
    Str.Free;
  end;
end;

Тем не менее, вам действительно нужно разделить пары значений до декодирования , а не после декодирования . Таким образом, & символов, закодированных как %26, не подвергаются жестокому обращению, например:

var
  Str: TStringList;
  Enc: TEncoding;
  I: Integer;
begin
  Str := TStringList.Create;
  try
    Enc := TEncoding.GetEncoding('TheCharsetHere'); // <-- !!!
    try
      Str.Delimiter := '&';
      Str.StrictDelimiter := True;
      Str.DelimitedText := ARequestInfo.QueryParams;
      for I := 0 to Str.Count-1 do begin
        Str[I] := TNetEncoding.URL.Decode(Str[I], [TDecodeOption.PlusAsSpaces], Enc);
      end;
    finally
      Enc.Free;
    end;
  finally
    Str.Free;
  end;
end;
...