Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.07.2012, 20:45   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Восклицание IdMultipartFormData и кириллица Delphi 2010

Имеется Delphi 2010 с Indy 10.5.5. Проблема широко распространённая, по ней имеется много тем, но нет ответов.
Код:
procedure TForm3.Button1Click(Sender: TObject);
var
  Data: TIdMultiPartFormDataStream;
  HTTP: TIdHTTP;
begin
  HTTP := TIdHTTP.Create(nil);
  try
    try
      Data := TIdMultiPartFormDataStream.Create;
      Data.AddFormField('nick', 'Попс');
      Data.AddFormField('status', '0');
      Data.AddFormField('xstatus', '29');
      Data.AddFormField('xstatustxt', 'Тест');
      HTTP.Post('http://localhost/login.php?', Data);
    except
    end;
  finally
    Data.Free;
    HTTP.Free;
  end;
end;
В итоге в php приходит вместо киррилицы ???
Пробовал:
1.
Код:
HTTP.HTTPOptions := [];
2.
Код:
AnsiToUtf8('Попс')
и
Код:
Utf8ToAnsi('Попс')
3.
Код:
  SS := TStringStream.Create('Попс', CP_UTF8);
  Data := TIdMultiPartFormDataStream.Create;
  Data.AddFormField('nick', SS.DataString);
Не помогает! Видел решение проблемы только с TStringStream, но в моём случае данные отправляются только в TIdMultiPartFormDataStream.
Shouldercannon вне форума Ответить с цитированием
Старый 26.07.2012, 09:54   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Возможно решение будет найдено только правкой компонента TIdMultiPartFormDataStream, если у Вас есть исходники - гляньте что-там по чем. Возможно он просто берет первую половину кодировки (ну то есть аглицкий и цифры). Либо внутри использует короткие строки в качестве типа данных.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.07.2012, 12:22   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Имеется такой файл.
Видел пример с модифицированным TIdMultiPartFormDataStream
Код:
 var 
  stream: TIdMultiPartFormDataStream; 
//// 
stream := TIdMultiPartFormDataStream.Create; 
  try 
    with stream do 
      begin 
        AddFormField('charcheck', 'йцукен', 'windows-1251').ContentTransfer := '8bit'; 
        AddFormField('message', AText, 'windows-1251').ContentTransfer := '8bit'; 
       //  
      end;
но самого файла нет.
Вложения
Тип файла: zip IdMultipartFormData.zip (4.1 Кб, 22 просмотров)
Shouldercannon вне форума Ответить с цитированием
Старый 26.07.2012, 15:53   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Во-первых, на время отладки можно добавить метод, который бы отслеживал данные меняющиеся с помощью AddFromField. Во-вторых, нужно также глянуть в TIdHTTP, может это он не умеет отправлять юникод.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 26.07.2012, 18:08   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

То, что TIdHTTP не умеет работать с юникод подтверждено. Спасает
Код:
var
  HTTP: TIdHTTP;
  SS: TStringStream;
begin
  HTTP := TIdHTTP.Create(nil);
  SS := TStringStream.Create('');
  try
    try
      HTTP.Get('localhost', SS);
      Result := SS.DataString;
    except
      Result := '';
    end;
  finally
    HTTP.Free;
    SS.Free;
  end;
end;
иначе ??? вместо кириллицы
Shouldercannon вне форума Ответить с цитированием
Старый 21.04.2013, 20:23   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
  Data: TIdMultiPartFormDataStream;
begin
  HTTP := TIdHTTP.Create(nil);
  try
    try
      Data := TIdMultipartFormDataStream.Create;
      Data.AddFormField('nick', UTF8Encode('Попс'), 'windows-1251').ContentTransfer := '8bit';
      Data.AddFormField('status', UTF8Encode('0'), 'windows-1251').ContentTransfer := '8bit';
      Data.AddFormField('xstatus', UTF8Encode('29'), 'windows-1251').ContentTransfer := '8bit';
      Data.AddFormField('xstatustxt', UTF8Encode('Тест'), 'windows-1251').ContentTransfer := '8bit';
      ShowMessage(HTTP.Post('http://localhost/login.php?', Data));
    except
    end;
  finally
    Data.Free;
    HTTP.Free;
  end;
end;
Shouldercannon вне форума Ответить с цитированием
Старый 21.04.2013, 21:00   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

1. UTF8Decode/Encode существуют с незапамятных времен.
2. С Delphi 2010 существует мощный TEncoding по сравнению с ним, функции из 1 варианта валяются укуреными в сторонке.
3. С Delphi 2010, INDY поддерживает TEncoding в GET, POST запросах(доп. параметр как константа) и чтобы все было шоколадно можно делать так:
Код:
sHTML:=http.Get('http://мойрусскийсайт/',TEncoding.UTF8);

Последний раз редактировалось Человек_Борща; 21.04.2013 в 21:03.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с idMultipartFormData kakawkin Работа с сетью в Delphi 0 01.03.2012 01:26
Word 2010 и Delphi 2010 David023 Мультимедиа в Delphi 1 30.04.2011 15:51
Не изменяется интерфейс моей программы при переходе с Delphi 7 на Delphi 2010 Elvisnya Общие вопросы Delphi 3 28.04.2011 15:59
IdMultipartFormData и отправка нескольких файлов grafgrial Работа с сетью в Delphi 1 06.02.2011 12:42
GlScene и Embarcadero Rad Studio 2010 (Delphi 2010) Fiery Fox Мультимедиа в Delphi 4 19.11.2010 21:46