Специальные символы для кодирования tidhttp Delphi

Я обновил приложение с D2007 до XE6. Он отправляет данные на веб-сервер.

Я не могу понять, какая кодировка будет правильно отправлять левый и правый символы кавычек (фрагмент кода ниже). Я пробовал каждый параметр, который я могу найти, но они кодируются, как ?при отправке (насколько я могу видеть в WireShark).

У D2007 не было проблем, но XE6 - это все о Unicode, и я не уверен, является ли проблема кодировкой или кодовыми страницами или что.

  Params := TIdMultipartFormDataStream.Create;
  params.AddFormField('TEST', 'Test a€?na€™ Try', 'utf8').ContentTransfer := '8bit';
  IdHTTP1.Request.ContentType := 'text/plain';
  IdHTTP1.Request.Charset := 'utf-8';
  IdHTTP1.Post('http://test.com.au/TestEncoding.php', Params, Stream);

delphi,character-encoding,http-post,

0

Ответов: 1


При вызове 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);
Дельфы, кодировки символов, HTTP-сообщение,
Похожие вопросы