Lazarus + LNet, сбитая кодировка

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Lazarus + LNet, сбитая кодировка

Сообщение Navern » 10.05.2010 06:03:55

Lazarus 0.9.28.2, LNet 0.6.2.

Делаю всё как в примере из комплекта поставки LNet:
Код: Выделить всё
function TForm1.GetComponentInput(ASocket: TLHTTPClientSocket; ABuffer: pchar; ASize: integer): integer;
var
  oldLength : DWord;
begin
  oldLength := Length(GetSource);
  SetLength(GetSource, oldLength + ASize);
  Move(ABuffer^, GetSource[oldLength + 1], ASize);
  SourceMemo.Text := GetSource;
  SourceMemo.SelStart := Length(GetSource);
  Result := aSize;
end;


В результате получаю исходник страницы, но в Memo все нелатинские символы отображаются вопросительными знаками. Пробовал даже заменить GetSource со String'a на WideString - в Мемо вообще все символы стали вопросительными знаками. Как быть?

Добавлено спустя 21 минуту 41 секунду:
Проверил, некоторые сайты он возвращает в правильной кодировке, а некоторые - нет. Те, у которых в заголовке ответа прописано "Content-Type: text/html; charset=windows-1251" (в т.ч. мой случай) возвращают вопросительные знаки, а вот если там же прописано UTF8, то всё в порядке. Нельзя ли как-то принудительно заставить сервер возвращать данные в нужной кодировке? Или можно как-то исправить кодировку уже "на месте"?
Последний раз редактировалось Navern 10.05.2010 11:50:10, всего редактировалось 1 раз.
Navern
незнакомец
 
Сообщения: 4
Зарегистрирован: 10.05.2010 04:07:25

Re: Lazarus + LNet, сбитая кодировка

Сообщение Vadim » 10.05.2010 07:38:05

Navern писал(а):Нельзя ли как-то принудительно заставить сервер возвращать данные в нужной кодировке?

Принудительно нельзя. HTTP-сервер не занимается конвертированием символов вообще, не его это дело. Отображение в правильной кодировке - дело браузера и он это делает на основе "charset=Кодовая_страница" , если таковое упоминание вообще есть. Если нет, то отображает кодировку ту, которая принята по умолчанию.
Вы можете, получив страничку, найти в ней значение charset и перекодировать уже на месте, согласно полученой кодировке.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus + LNet, сбитая кодировка

Сообщение Navern » 10.05.2010 08:28:52

и перекодировать уже на месте

Вот это мне и интересней более всего. Как?
Navern
незнакомец
 
Сообщения: 4
Зарегистрирован: 10.05.2010 04:07:25

Re: Lazarus + LNet, сбитая кодировка

Сообщение Vadim » 10.05.2010 08:51:00

Из той кодировки, в которой страница, в UTF-8. :)
Или Вас интересует полный и исчерпывающий список функций с подробным описанием, да и ещё (какой ужас!!!) на русском языке? :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus + LNet, сбитая кодировка

Сообщение Navern » 10.05.2010 09:06:06

Или Вас интересует полный и исчерпывающий список функций


Попытатйтесь вникнуть. То, что меня интересует, очень доходчиво и понятно изложено в первом сообщении. LNet возвращает тело страницы по кускам в ABuffer, который уже содержит данные в неправильной кодировке. Вот я и спрашиваю, что мне необходимо сделать для того, чтобы в получаемом ABuffer (событие onInput) не было вопросительных знаков вместо кириллицы.

Я пробовал делать UTF8toAnsi, но это, разумеется, не помогло, вместо кириллицы по-прежнему вопросы.

Очень странно, но я не нашёл ни дного упоминания о данной проблеме ни на этом форуме, ни где-либо ещё. Не верю, что все без исключения веб-серверы всегда возвращают данные в чарсете UTF-8.

Добавлено спустя 4 часа 12 минут 29 секунд:
Я разобрался. В общем, надо было не декодировать UTF8, а наоборот, кодировать. Помогла функция UTF8Encode().

Вдруг кому ещё пригодится...
Navern
незнакомец
 
Сообщения: 4
Зарегистрирован: 10.05.2010 04:07:25

Re: Lazarus + LNet, сбитая кодировка

Сообщение Vadim » 10.05.2010 13:34:53

Т.е. Вы не знали, что Lazarus выводит все строки только в UTF-8?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Lazarus + LNet, сбитая кодировка

Сообщение Navern » 10.05.2010 15:31:44

Вадим, большое вам спасибо за неоценимую помощь. Без ваших, вне всякого сомнения, ценных советов я бы никогда не разобрался с проблемой.
Navern
незнакомец
 
Сообщения: 4
Зарегистрирован: 10.05.2010 04:07:25


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44

Рейтинг@Mail.ru