Сразу хочу обратить внимание, это не баг, а простая недоработка. Надеюсь в следующей версии (или ближайшем апдейте/хотфиксе) ее устранят.
Теперь к сути.
Если кодировать/декодировать данные в пределах одной платформы, то проблем нет, но они появляются когда эти процессы происходят на разных платформах. В моем случае кодирование происходит на Windows, а декодирование на Android. Вот функции декодирования ():
function DecodeString(const Input: string;
InputEncoding, OutputEncoding: TEncoding): string;
var
InStr, OutStr: TStringStream;
begin
InStr := TStringStream.Create(Input); // !!!
try
OutStr := TStringStream.Create(''); // !!!
try
DecodeStream(InStr, OutStr);
Result := OutStr.DataString; // Тут возникает ошибка
finally
OutStr.Free;
end;
finally
InStr.Free;
end;
end;
А конструктор TStringStream.Create выглядит так:
constructor TStringStream.Create(const AString: string);
begin
Create(AString, TEncoding.Default, False);
end;
TEncoding.Default для Windows равен ANSI, а для Android UTF8. Отсюда ошибка No mapping for the Unicode character exists in the target multi-byte code pdge.
Для решения а сделал перезагруженные методы EncodeString и DecodeString, подробности во вложении. Положите файл в папку с проектом и пользуйтесь. Надеюсь разработчики прислушаются и доработают модуль.
Soap.EncdDecd.zip