| Получение кода из страницы или неправильная кодировка |
| 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
Группа: Администраторы
Сообщений: 1223
Награды: 16
Репутация: 2
Статус: Offline
| Нужно изменять кодировку полученных строк. Почитай тут http://delphidevelop.ru/publ/35-1-0-175
Не оказываю помощь через личные сообщения и ICQ
|
| |
| | |
| gromdron | Дата: Среда, 23.06.2010, 19:03 | Сообщение # 3 |
|
Ранг 1
Группа: Проверенные
Сообщений: 12
Награды: 0
Репутация: 0
Статус: Offline
| К несчастью у меня компьютер почему-то не воспиримает ваш вариант. При добавлении этого кода, ничего не меняется...
|
| |
| | |
| Admin | Дата: Среда, 23.06.2010, 19:59 | Сообщение # 4 |
Ранг 10
Группа: Администраторы
Сообщений: 1223
Награды: 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
Группа: Администраторы
Сообщений: 1223
Награды: 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 |
Ранг 3
Группа: Проверенные
Сообщений: 78
Награды: 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 |
Ранг 3
Группа: Проверенные
Сообщений: 78
Награды: 1
Репутация: 0
Статус: Offline
| Можно к примеру запрашивать список имен не каждый раз а только раз в 5 минут к примеру...или запрашивать размер списка...если он изменился то качать заного, а если нет использовать старый...тем самым экономя трафик и время пользователя.
|
| |
| |
|