(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 .

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



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

Магазин программного обеспечения   WWW.ITSHOP.RU
Enterprise Connectors (1 Year term)
Delphi Professional Named User
SmartBear AQtime Pro - Node-Locked License (Includes 1 Year Maintenance)
Stimulsoft Reports.Ultimate Single License Includes one year subscription, source code
Enterprise Connectors (1 Year term)
 
Другие предложения...
 
Курсы обучения   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
Мастерская программиста
Corel DRAW - от идеи до реализации
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100