Как правильней определять кодировку ? в хидерах или в самой странице?

12
A5
На сайте с 11.05.2009
Offline
37
909

Будте добры, подскажите как правильнее определять кодировку страниц для дальнейшего их отобрадения. по http заголовкам, генерируемым самим сервером, либо основываясь на <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=..."> ?

Как я понял браузеры этот тег вобще сейчас не учитывают. Потому как, что в нём не пиши, ни в IE ни в Опере ничего меняется..

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

R
На сайте с 06.06.2004
Offline
44
#1

Правильнее делать оба варианта :)

DI
На сайте с 03.01.2007
Offline
123
#2

alex545, если кодировка вообще не обозначена никаким из способов - то она определяется по первым 1000 символов из html-документа. На этом основан xss по utf-7, поэтому нужно использовать оба варианта. Если к хедерам сервера не всегда есть доступ, то на странице указать этот тег нужно обязательно (самым первым в блоке <head>, во избежание xss).

Высказывание идиотского утверждения требует на порядок меньше усилий, чем его последовательное и обоснованное опровержение и более того, иногда это опровержение вообще невозможно. © (http://zhurnal.lib.ru/s/shapiro_m_a/raspidiota.shtml)
zhidronsss
На сайте с 12.10.2007
Offline
36
#3

1. meta браузеры учитывают. если туда прописать левую кодировку (например windows-1252) можно увидеть реакцию.

2. То что отдает сервер (кодировка), важнее чем meta, хотя бы потому что отдается http заголовками первой. Именно поэтому, если сервер отдает http заголовок то можно meta не указывать. Но ругать не будут, если 2 варианта работают

zhidronsss
На сайте с 12.10.2007
Offline
36
#4

1. meta браузеры учитывают. если туда прописать левую кодировку (например windows-1252) можно увидеть реакцию.

2. То что отдает сервер (кодировка), важнее чем meta, хотя бы потому что отдается http заголовками первой. Именно поэтому, если сервер отдает http заголовок то можно meta не указывать. Но ругать не будут, если 2 варианта работают

T.R.O.N
На сайте с 18.05.2004
Offline
314
#5
alex545:
может ли быть ситуация при которой сервер не возвращает в хидере кодировку

Может. Если скрипт или сервер криво настроен.

alex545:
если может то, как браузеры определят кодировку в таком случае

если нет не меты ни хидера - установка по умолчанию (у любого броузера она есть) + IE иногда умеет как и любой текстовый редактор (ведь распознать KOI WIN или UTF достаточно легко по специфике пакета, а вот правильно узнать кодовую страницу - это уже из дефолтовых предпочтений)

alex545:
Будте добры, подскажите как правильнее определять кодировку страниц для дальнейшего их отобрадения

Заголовок сервере + мета.

PS Не забывайте еще о индексирующих ботах.Вот они, как правило, воспринимают тольок заголовок сервера.

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
sun
На сайте с 22.10.2005
Offline
81
sun
#6

Иногда сам apche не верно настроен и отдает кодировку не ту, в которой сама страница. Есть простой метод определения такой страницы.

При условии, что текст русский на странице.


// Define encoding of text
public function get_encoding($str) {
$str_to_check = self::html2txt($str);
$str_to_check = self::make_additional_text_cleaning($str_to_check);

$russian_o_utf8 = 'о';
$russian_o_win1251 = iconv('utf-8', 'windows-1251', $russian_o_utf8);
$russian_o_koi = iconv('utf-8', 'koi8-r', $russian_o_utf8);
$russian_o_iso = @iconv('utf-8', 'ISO-8859-1', $russian_o_utf8);
$russian_o_iso5 = @iconv('utf-8', 'ISO-8859-5', $russian_o_utf8);

$encoding_counter = array();
$encoding_counter["utf-8"] = @mb_substr_count($str_to_check, $russian_o_utf8, 'utf-8');
$encoding_counter["windows-1251"] = @mb_substr_count($str_to_check, $russian_o_win1251, 'windows-1251');
$encoding_counter["koi8-r"] = @mb_substr_count($str_to_check, $russian_o_koi, 'koi8-r');
$encoding_counter["ISO-8859-1"] = @mb_substr_count($str_to_check, $russian_o_iso, 'ISO-8859-1');
$encoding_counter["ISO-8859-5"] = @mb_substr_count($str_to_check, $russian_o_iso5, 'ISO-8859-5');

arsort($encoding_counter);
return key($encoding_counter);
}
devmen.com (http://devmen.com/)
[Удален]
#7
sun:
Иногда сам apche не верно настроен и отдает кодировку не ту, в которой сама страница. Есть простой метод определения такой страницы.

Апач вообще не знает в какой кодировке у вас страница, т.к. одна страница может быть в утф, другая в вин1251, а главная так вообще в кои8р. Что скажете отдавать апачу - он то и отдаст. Это не настройка апача, а неверно написанный скрипт, который не может сказать в какой кодировке он отдаёт данные.

sun
На сайте с 22.10.2005
Offline
81
sun
#8

nikitian, есть настройка в апаче default charset, если она будет иной от кодировки скриптов, то можно поймать существенный глюк.

V
На сайте с 09.06.2008
Offline
7
#9

легче всего в .htaccess добавить AddDefaultCharset UTF-8 (ну или какая там кодировка нужна)

[Удален]
#10



function getTitleFromUrl($url, &$executionTime)
{
$start = microtime(true);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
$headerContentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
curl_close($ch);

if ( !empty($html) )
{
$title = array();
preg_match('/<title>(.*)<\/title>/i', $html, $title);
if ( !empty($title[1]) )
{
$encoding = '';
if ( empty($encoding) )
{// если сервер не вернул тип документа, то попытаемся найти его в html-е документа
// print 'Trying to get encoding from html<br/>';
$htmlMeta = array();
preg_match('/<meta([^<.]*http\-equiv=["\'`]?content\-type["\'`]?.*?)\/?>/i', $html, $htmlMeta);
if ( !empty($htmlMeta[1]) )
{// если удалось найти тег, описывающий тип документа
// print 'Seems to found meta tag: [<b>'.$htmlMeta[1].'</b>]<br/>';
$htmlContentType = array();
preg_match('/content=["\'`]([^"^\'^`.]*)["\'`]/i', $htmlMeta[1], $htmlContentType);
if ( !empty($htmlContentType[1]) )
{// если тип документа удалось определить
// print 'Seems to found content-type: [<b>'.$htmlContentType[1].'</b>]<br/>';
$htmlEncoding = array();
preg_match('/charset=(.*)/i', $htmlContentType[1], $htmlEncoding);
if ( !empty($htmlEncoding[1]) )
{// если тип документа содержит кодировку
$encoding = strtoupper(trim($htmlEncoding[1]));
// print 'Seems to found encoding in html: [<b>'.$encoding.'</b>]<br/>';
}
}
}
}
if ( empty($encoding) )
{
if ( !empty($headerContentType) )
{// если сервер вернул заголовок с типом документа
// print 'Trying to get encoding from header. Content-type: [<b>'.$headerContentType.'</b>]<br/>';
$headerEncoding = array();
preg_match('/charset=(.*)/i', $headerContentType, $headerEncoding);
if ( !empty($headerEncoding[1]) )
{// если тип документа содержит кодировку
$encoding = strtoupper($headerEncoding[1]);
// print 'Seems to found encoding in header: [<b>'.$encoding.'</b>]<br/>';
}
}
}

$title = $title[1];
if ( $encoding != ''
&& $encoding != 'UTF-8' )
$title = @iconv($encoding, 'UTF-8', $title);
$executionTime = microtime(true) - $start;
return $title;
}
}
return false;
}

есть у меня функция на пхп, которая выделяет тайтл со страницы, попутно переводя его в утф-8 из текущей кодировки.

если надо - берите :)

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий