При вызове params.AddFormField()вы устанавливаете кодировку 'utf8', что не является допустимым именем кодировки. 'utf-8'Вместо этого используется служебное имя :
params.AddFormField('TEST', 'Test a€?na€™ Try', 'utf-8').ContentTransfer := '8bit';
При компиляции для Unicode некорректная кодировка заканчивается использованием встроенного 8-битного кодировщика Indy, который кодирует кодовые страницы Unicode> U + 00FF в виде байта 0x3F ( '?'). Квоты, которые вы используете, a€?и a€™, являются кодовыми точками U + 2018 и U + 2019, соответственно.
Причина, по которой вы не сталкивались с этой проблемой в D2007, заключается в том, что TIdFormDataField.Charsetсвойство игнорируется для целей кодирования при компиляции для Ansi. TIdFormDataField.FieldValueСвойство является AnsiString, и его исходные байты получают передаются как есть, так что вы должны убедиться , что он закодирован правильно , прежде чем добавить TIdMultipartFormDataStream, например:
params.AddFormField('TEST', UTF8Encode('Test a€?na€™ Try'), 'utf-8').ContentTransfer := '8bit';
На боковой ноте вам не нужно устанавливать свойства Request.ContentTypeили Request.Charsetпри публикации TIdMultipartFormDataStream(и тем более, 'text/plain'что это недопустимый тип содержимого для сообщения MIME). Эта версия Post()будет устанавливать эти свойства для вас:
Params := TIdMultipartFormDataStream.Create;
params.AddFormField(...);
IdHTTP1.Post('http://test.com.au/TestEncoding.php', Params, Stream);