(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Нахождение кодировки веб-страницы.

В принципе, для постоянных посетителей моего блога этот пост не несет какой-либо сверх-новой информации по работе с веб-страницами в 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 .

И, наконец, после того как кодировка определена, Вы можете приступать к переводу кракозябров на русский язык. На всякий случай приведу ссылку на документ, который содержит таблицу всех стандартных кодировок, их идентификаторов, синонимов и кодовых страниц - вот она.



 Распечатать »
 Правила публикации »
  Обсудить материал в конференции Embarcadero »
Написать редактору 
 Рекомендовать » Дата публикации: 08.04.2011 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Delphi Professional Named User
Enterprise Connectors (1 Year term)
Microsoft Office 365 Бизнес. Подписка на 1 рабочее место на 1 год
Quest Software. SQL Navigator for Oracle
Pinnacle Studio 21 Plus. Электронный ключ.
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Компьютерный дизайн - Все графические редакторы
СУБД Oracle "с нуля"
Новые материалы
Программирование на Visual Basic/Visual Studio и ASP/ASP.NET
Утиль - лучший бесплатный софт для Windows
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Разработка программ базы данных (63)
Написание прикладных компьютерных программ (базы данных) на заказ. Разработка корпоративных...
 
Кухня (4)
Хочу сделать ремонт на кухне. Где приобрести кухонную плиту? Какой фирмы стоит её рассматривать?
 
Как в IBM Rational DOORS сделать заголовки не жирным шрифтом? (2)
Измучился уже, когда идет иерархия уровнем ниже, чем Х.Х., мне нужно, чтобы заголовки не...
 
Ищу программиста для написания программы (62)
Ищу программиста ,владеющего Вижуал Бэйсик и программированием в Экселе, для написания...
 
Отличается ли ДрифтКазино от беттинга? (18)
Друзья, давно заметил, что на Дрифте уже несколько месяцев во всю рекламируется и предлагается...
 
 
 



    
rambler's top100 Rambler's Top100