Странности с поведением браузеров в кодировке get-параметров (Windows-1251 / UTF-8)

Привет,

Есть локальная машинка, на которой пишется и отлаживается всякое разное, преимущественно на PHP. Обнаружил странное (не сказать — неприятное) поведение разных браузеров при кодировании запроса.

Вот тестовый файлик:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Превед</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<p>
<?php
    echo '<strong>'.$_GET['param'].'</strong><br />';
    echo $_SERVER['HTTP_USER_AGENT'].'<br />';
    echo $_SERVER['HTTP_ACCEPT_CHARSET'].'<br />';
?>
</p>
</body>
</html>


* This source code was highlighted with Source Code Highlighter.



А вот, что любопытно, результат:
image

Вот — firebug с ответом сервера:

HTTP/1.1 200 OK
Date: Sun, 22 Jan 2012 22:02:57 GMT
Server: Apache/2.2.20 (Win32) PHP/5.2.17
X-Powered-By: PHP/5.2.17
Content-Length: 467
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8


Как видно, UTF-8 в запросе передает только Chrome (я не менял никаких настроек в браузерах). Все остальные начинают нормально отображать введенную кириллицу только при явном переключении браузера на Win-1251.

Меня несколько смущает такое поведение, причем, в основном тем, что я не могу понять — то ли надо больше спать и меньше писать руками в адресной строке, то ли все же что-то надо исправлять :)

Больше всего напрягает то, что в реальном проекте определить кодировку входных данных весьма непросто (вот тут тема раскрыта очень хорошо). Еще несколько непонятен тот факт, что те же браузеры к википедии, например, абсолютно корректно все передают.
Что и где неправильно?
  • Вопрос задан
  • 11386 просмотров
Решения вопроса 1
homm
@homm
Не пишите руками в адресной строке. Так как достоверных источников информации нет, браузеры считают что руки у вас в кодировке win-1251.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
WebSpider
@WebSpider
то ли надо больше спать и меньше писать руками в адресной строке

Абсолютно верно, особенно насчёт второго пункта :)

Из скриншота с фф отлично видно, что слово «превед» в get-параметре у вас передано в кодировке windows-1251, поэтому и выводится оно некорректно на странице с кодировкой utf-8.

В википедии же ссылка выглядит так: ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B2%D0%B5%D0%B4

Соответственно, если вы передадите такой же get-параметр — везде всё будет работать как надо:
autoref.local/test.php?param=test%20%D0%9F%D1%80%D0%B5%D0%B2%D0%B5%D0%B4
Ответ написан
@himik
в начале страницы
<?php header("Content-Type: content=text/html; charset=utf-8"); ?>
Ответ написан
taliban
@taliban
php программист
Денвер стоит?
Ответ написан
В Файерфоксе параметр явно закодирован не в Utf-8. Должно быть ?param=test%20test=%D0%BF%D1%80%D0%B5%D0%B2%D0%B5%D0%B4. Чем кодировали?
Ответ написан
MTonly
@MTonly
Веб-разработчик с 2002 года
Не используйте GET-параметры с нелатинскими символами. Используйте чистые URL-адреса («ЧПУ») вида «/раздел/подраздел/» — основную часть URL-адреса все распространённые браузеры уже давно отправляют в кодировке UTF-8.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы