Здравствуйте, Гость
Воскресенье, 22.10.2017, 23:26
Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: Ekz 
Форум » Все о Delphi » Интернет и сети » Получение кода из страницы или неправильная кодировка
Получение кода из страницы или неправильная кодировка
gromdronДата: Среда, 23.06.2010, 15:28 | Сообщение # 1
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
В общем пишу сейчас небольшой специфический генератор имен, и хотел бы сделать функцию по проверки уже занятых имен.

Код программы:

Code
unit Poluchatel;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdHTTP, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
IdHTTP1: TIdHTTP;
RichEdit1: TRichEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
res,s,res2:string;
i:integer;
begin
RichEdit1.Clear;
res:=idHTTP1.get('http://gromdron.narod2.ru/news/?news=1');
Delete(res, 1, pos('<spisok>',res)+13);
res2:=Copy(res,1,pos('</spisok>',res));
s:='';
for i:=0 to length(res2) do
begin
If (res2[i]<>'') and (res2[i]<>' ') then s:=s+res2[i];
If res2[i]=' ' then begin RichEdit1.Lines.Add(s); s:=''; end;
end;
for i:=0 to RichEdit1.Lines.Count do
begin
If (RichEdit1.Lines[i]=' ') or (RichEdit1.Lines[i]='') then RichEdit1.Lines.Delete(i);
end;
end;
end.

Проблема состоит в том, что при работе с локальным сайтом все идеально: заходит, забирает, делит, пишет и все на русском. Но вот при работе в сети Интернет вместо русских символов, в независимости от кодировки появляются галиматья. Вернее не появляется вместе с русскими буквами, а заменяется.

Кто может подсказать как это исправить или в чем может быть проблема ? И с точки зрения быстродействия: насколько хорошо будет работать такая конструкция? Может быть есть способ увеличить быстродействие ?

 
AdminДата: Среда, 23.06.2010, 18:53 | Сообщение # 2
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Нужно изменять кодировку полученных строк.
Почитай тут http://delphidevelop.ru/publ/35-1-0-175


Не оказываю помощь через личные сообщения и ICQ
 
gromdronДата: Среда, 23.06.2010, 19:03 | Сообщение # 3
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
К несчастью у меня компьютер почему-то не воспиримает ваш вариант.
При добавлении этого кода, ничего не меняется... sad
 
AdminДата: Среда, 23.06.2010, 19:59 | Сообщение # 4
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Вы другую кодировку пробовали?

Не оказываю помощь через личные сообщения и ICQ
 
gromdronДата: Среда, 23.06.2010, 20:02 | Сообщение # 5
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
Пробовал utf-8 как на сайте, не помогает.
 
AdminДата: Среда, 23.06.2010, 21:23 | Сообщение # 6
Ранг 10
Группа: Пользователи
Сообщений: 1268
Награды: 16
Репутация: 2
Статус: Offline
Должно работать. Ты уверен что сервер именно в этой кодировке передает?

Не оказываю помощь через личные сообщения и ICQ
 
gromdronДата: Среда, 23.06.2010, 21:59 | Сообщение # 7
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
Насчет сервера не уверен, а вот браузеру в коде отсылается: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
XakerДата: Четверг, 24.06.2010, 05:57 | Сообщение # 8
Ранг 4
Группа: Проверенные
Сообщений: 83
Награды: 1
Репутация: 0
Статус: Offline
Была у меня такая проблема.... решил так:

Code
function UTF8ToStr(Value: String): String;
var
   buffer: Pointer;
   BufLen: LongWord;
begin
   BufLen := Length(Value) + 4;
   GetMem(buffer, BufLen);
   FillChar(buffer^, BufLen, 0);
   MultiByteToWideChar(CP_UTF8, 0, @Value[1], BufLen - 4, buffer, BufLen);
   Result := WideCharToString(buffer);
   FreeMem(buffer, BufLen);
end;

function UTF8ToStrSmart(Value: String): String;
var
   Digit: String;
   i: integer;
   HByte: Byte;
   Len: Byte;
begin
   Result := '';
   Len := 0;
   if Value = '' then Exit;
   for i := 1 to Length(Value) do
   begin
     if Len > 0 then
     begin
       Digit := Digit + Value[i];
       Dec(Len);
       if Len = 0 then
         Result := Result + UTF8ToStr(Digit);
     end else
     begin
       HByte := Ord(Value[i]);
       if HByte in [$00..$7f] then       //Standart ASCII chars
         Result := Result + Value[i]
       else begin
         //Get length of UTF-8 char
         if HByte and $FC = $FC then
           Len := 6
         else if HByte and $F8 = $F8 then
           Len := 5
         else if HByte and $F0 = $F0 then
           Len := 4
         else if HByte and $E0 = $E0 then
           Len := 3
         else if HByte and $C0 = $C0 then
           Len := 2
         else begin
           Result := Result + Value[i];
           Continue;
         end;
         Dec(Len);
         Digit := Value[i];
       end;
     end;
   end;
end;

Ну и к вашему коду будет так...

Code
res:= UTF8ToStrSmart(idHTTP1.get('http://gromdron.narod2.ru/news/?news=1'));
 
gromdronДата: Четверг, 24.06.2010, 13:02 | Сообщение # 9
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
Спасибо Xaker, ваше решение очень помогло.

А насчет приведенного мною кода, про быстродействие и возможные ошибки, можете что подсказать ? Я просто новичек в Delphi и изучаю самостоятельно, поэтому не уверен что данная конструкция будет быстрой и безошибочной.

 
XakerДата: Пятница, 25.06.2010, 04:51 | Сообщение # 10
Ранг 4
Группа: Проверенные
Сообщений: 83
Награды: 1
Репутация: 0
Статус: Offline
Можно к примеру запрашивать список имен не каждый раз а только раз в 5 минут к примеру...или запрашивать размер списка...если он изменился то качать заного, а если нет использовать старый...тем самым экономя трафик и время пользователя. wink
 
Форум » Все о Delphi » Интернет и сети » Получение кода из страницы или неправильная кодировка
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2017
Хостинг от uCoz