Знаходження кодування веб-сторінки., HTML, XML, DHTML, Інтернет-технології, статті

В принципі, для постійних відвідувачів мого блогу цей пост не несе будь-якої над-нової інформації по роботі з веб-сторінками в Delphi. Тема кодувань піднімалася в тій чи іншій мірі вже кілька разів на WebDelphi і цей пост скоріше є, чимось середнім між постом, об'єднуючим воєдино розкидану по іншим постам інформацію і великим-великим відповіддю на коментар користувача.


Задачу будемо вирішувати наступну: є якась веб-сторінка (адреса заздалегідь не відомий), потрібно отримати будь-який текст з цієї сторінки легкотравному читабельному вигляді, тобто без знаків ?????, кракозябри і т.д.


Як відомо всім ще зі шкільної лави – будь-яке завдання можна вирішити кількома способами. Подивимося, що за способи можна використовувати для отримання кодування web-сторінки в Delphi.


Спосіб № 1 – визначення кодування по заголовкам сервера.


Будь-який запит на сервер або відповідь сервера містить заголовки (Headers) – прописна істина, яку має знати всім. Якщо сервер повертає нам заголовок Content-Type, то по ньому можна спробувати дізнатися кодування тексту на сторінці, наприклад, при використанні Synapse код пошуку кодування по заголовкам може бути таким:




function GetCharset(Headers: TStringList): string;
var i:integer;
begin
if Headers.Count=0 then Exit;
for I := 0 to Headers.Count – 1 do
begin
//Content-Type: text/html; charset=UTF-8
if Pos(content-type,LowerCase(Headers[i]))>0 then
if pos(=,Headers[i])>0 then
Result: = LowerCase (Copy (Headers [i], pos (=, Headers [i]) +1,




                  Length(Headers[i])-pos(=,Headers[i])))
else
Result:=DefCharset;
end;
end

Якщо заголовок Content-Type містить, наприклад, ось такий текст:

Content-Type: text/html; charset=UTF-8

То функція поверне нам значення "UTF-8" – то що нам і треба для того, щоб правильно перетворити кодування (для того як перетворити кодування, див. "3 варіанти роботи з кодуваннями веб-сторінок в Delphi.").


Самі заголовки Ви можете отримати двома способами:



  1. Відправивши GET-запит на адресу – в цьому випадку заголовки прийдуть разом з вмістом документа

  2. Перед виконанням GET-запиту можна відправити запит HEAD – В цьому випадку Вам відповідь сервера буде містити лише заголовки без тіла повідомлення.

Чому на початку цього розділу я сказав "можна спробувати дізнатися кодування"? Тому що сервер в заголовку Content-Type не завжди повертає значення кодувань. Тому завжди передбачайте якесь дефолтний значення кодування, наприклад, як у наведеному вище лістингу – дефолтна кодування заноситься в константу DefCharset.


Спосіб № 2 – визначення кодування сторінок по мета-тегам.


Якщо пошук кодування по способу № 1 не увінчався успіхом можна вдатися до способу № 2 – Витягнути кодування з мета-тегів сторінки. Для цього нам треба пропарсіть контент сторінки в пошуках ось такого мета-тега:




 <Meta http-equiv = "Content-Type" content = "text / html; charset = utf-8" />
 

Як це зробити? Та як Вам буде завгодно, наприклад, якщо згадати. що в Delphi XE з'явився модуль для роботи з регулярними виразами, то функція парсинга матиме наступний досить компактний вигляд:




function TForm5.CharsetByMeta(Body: string): string;
const
Pattern = ;
var
RegEx: TRegEx;
M: TMatchCollection;
begin
//
RegEx := TRegEx.Create(Pattern, [roIgnoreCase, roMultiLine]);
if RegEx.IsMatch(Body) then
begin
M:= RegEx.Matches(Body);
Result := Trim(M[0].Groups[1].Value);
end
else
Result := DefCharset;
end;

Функція витягає з мета-тега значення кодування. Знову ж слід пам'ятати, що і цей спосіб може не спрацювати, тому в функції знову зустрічається константа DefCharset.


І, нарешті, після того як кодування визначена, Ви можете приступати до перекладу кракозябри на російську мову. Про всяк випадок наведу посилання на документ, який містить таблицю всіх стандартних кодувань, їх ідентифікаторів, синонімів і кодових сторінок – ось вона.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*