При вызове 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);