По умолчанию 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;