/ домой \ | \ темы / |
09/03/2010 13:43 rvv: |
Добрый день. Подскажите пожалуйста, как решить следующую проблему. У меня сайт построен с элементами аджакса, динамическая подгрузка контента. Есть контент в виде html и в виде php. Если для РНР я еще могу в php.ini указать charsetdefault='windows-1251', то для html заголовки игнорируются. Точнее, веб-сервер воспринимает для аджакс-запросов кодовую страничку в UTF8 и, естественно, отвечает темже. Раньше у меня стоял апач, но там можно было задать кодовую страничку по умолчанию. Возможно ли подобное зделать для SHHTPS ? Спасибо. |
10/03/2010 07:41 Kinsler: |
это вина твоего обозревателя. Похожие проблемы испытываю при использовании FireFox.
|
10/03/2010 08:17 rvv: |
Я и говорю, что для аджакс-запросов через XMLHttpRequest() или ActiveXObject("Microsoft.XMLHTTP"), используется UTF-8. Там нельзя иначе (хотя может я чего и не знаю). Пока, кроме апача, я не нашел веб-сервер, который позволял бы выставить кодовую страницу по-умолчанию. Для апача директива: AddDefaultCharset WINDOWS-1251 Вот и спрашиваю, можно ли зделать аналогично для Small HTTP Server |
10/03/2010 09:18 Max: |
В заголовке html документов можно указывать: <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <meta http-equiv="Content-language" content="ru"> Также из самого скрипта можно управлять служебным заголовком, перед выводом страницы. Все что скрипт передает до разделительной пустой строки интерпретируется как служебная часть HTTP ответа. И наконец, на крайний случай, в сервере есть настройка "Advanced code for control header." в которой можно указать фиксированые поля HTTP ответа. |
10/03/2010 14:42 rvv: |
Макс, спасибо за информацию. Не могли бы вы объяснить более подробно, что должно быть в строке header="..." конфигфайла, чтобы нормально отображались русские буквы в кодировке windows-1251 при аджакс-запросах. Дело в том, что заголовки html-файла типа: <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <meta http-equiv="Content-language" content="ru"> не учитываются при динамической подгрузке контента. Я пробовал разные комбинации в "Advanced code for control header.", но ничего не добился. |
10/03/2010 19:41 Max: |
В данном случае ничего добиваться не надо. Значение имеет только кодировка исходного документа и кодировки просто должны совпадать. Весь документ (и исходный и дальнейшии модификации) должны быть в одной и той же кодировке.
|
10/03/2010 20:17 rvv: |
Рискну показаться назойливым, но вот пример, который выдает русские буквы только в Хроме. Характеристики системы: Windows XP SP3, Small HTTP Server 3.05.85 Главный файл a.htm : <html> <head> <script language="JavaScript"><!-- function processReqChange(){ if (req.readyState == 4){ if (req.status == 200){ document.form1.headers.value = req.getResponseHeader('Content-Type'); document.form1.ready.value = req.readyState; document.form1.status.value = req.status; document.form1.content.value = req.responseText; } else { alert("Ошибка работы сервера!\nstatus="+req.status+"\nstatusText="+req.statusText); }; }; }; function loadXMLDoc(){ var url = 'aa.htm'; if (window.XMLHttpRequest){ req = new XMLHttpRequest(); req.onreadystatechange = processReqChange; req.open("GET",url,true); req.send(null); } else if (window.ActiveXObject){ req = new ActiveXObject("Microsoft.XMLHTTP"); if (req) { req.onreadystatechange = processReqChange; req.open("GET",url,true); req.send(); } else { alert('Невозможно создать динамический запрос !'); }; }; return false; }; --></script> </head> <body> <a href="javascript:void(0)" onClick="return loadXMLDoc()">нажми</a><br> <form name="form1"> headers: <input type=text size=50 name="headers" value=""><br> ready: <input type=text size=50 name="ready" value=""><br> status: <input type=text size=50 name="status" value=""><br> content: <input type=text size=50 name="content" value=""> </form> </body></html> Второй файл aa.htm, который подгружается как динамический контент через аджакс: <html> <head> <meta http-equiv="Content-Language" content="ru"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head> <body> это русский текст в кодировке windows-1251 </body></html> Тут вставлены мета-теги только как дань некоторым "советам". Они полностью игнорируются всеми бровзерами. |
10/03/2010 20:22 rvv: |
P.S. Просто скажите, что надо поставить в "Advanced code for control header.", чтобы сервер передавал для всех HTML-файлов кодировку windows-1251. Я не могу разобраться в какой именно форме надо там прописывать заголовки.
|
11/03/2010 16:09 Max: |
В данном случае ничего в "Advanced code for control header" добавлять не надо. Часть: <head> <meta http-equiv="Content-Language" content="ru"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> ... -- должна быть в основном файле. Во вотром файле метотеги естественно не нужны. И заголовок не нужен. Там исключительно текст который будет использован. В основном файле, главное даже не наличие метотега, а кодировка самого файла -- кодировки должны совпадать и уж если в заголовке указано что это windows-1251 то такой и должна быть. |
11/03/2010 16:17 Max: |
А сервер вообще кодировку не меняет. В какой у вас файл лежит такую он и отдает.
|
12/03/2010 07:51 rvv: |
Последний раз и больше не буду никого "доставать" :) Уважаемый Макс, Вы не правы. Разъясняю: 1. В главном файле строки <meta http-equiv="Content-Language" content="ru"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> ничего не дают для определения кодировки в подгружаемом файле, поскольку все запросы аджакса идут в UTF8 (как я писал). В результате, даже если сервер ничего не меняет, русские буквы идут кракозяблами. НА ПРИНУДИТЕЛЬНАЯ УСТАНОВКА КОДИРОВКИ! 2. Все МЕТА-теги в подгружаемом файле игнорируются, поскольку основная страница уже сформирована, а чтобы бровзер перекодировал страницу в кодировку windows-1251 надо, чтобы вместо с данными был передан заголовок (НЕ СТРОКИ <meta http-equiv="Content-Language" content="ru"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> ) 3. Если в указанной мной выше основной программе, после строки if (req.readyState == 4){ добавить : alert(req.getAllResponseHeaders()); То можно будет увидеть передаваемые заголовки. 4. Потом добавляем вызов не только файла aa.htm, но и aa.php, а в php.ini прописываем строку : default_charset = "windows-1251" 5. Теперь PHP устанавливает для всех формируемых файлов кодировку windows-1251. 6. Можно загрузить, через основной файл, сначала HTML, потом РНР документ и наблюдать разность в заголовках. А разность такова. Для HTML - Content-Length: 70 Content-Type: text/html Last-Modified: Thu, 11 Mar 2010 20:05:07 GMT Для РНР - X-Powered-By: PHP/5.2.8 Content-type: text/html; charset=windows-1251 Почувствуйте разницу :) Как видим, РНР добавил кодовую страницу, а для HTML ее нет. ПОЭТОМУ надо, чтобы сервер сам добавлял заголовок для всех HTML-документов. Вот это я и хочу добиться. ЧТО надо прописать в "Advanced code for control header", чтобы сервер формировал Content-type: text/html; charset=windows-1251 ? Или это надо писать в МИМ-типах ? В какой форме это писать (с кавычками или без) ? Пожалуйста, напишите работающий пример. |
12/03/2010 07:58 rvv: |
Возможно тема покажется Вам несущественной, но проблема русских букв и аджакса стоит в интернете довольно остро. Неужели в таком отработанном продукте, как Small HTTP Server, нельзя ее решить. |
12/03/2010 08:02 oleg25: |
А зачем вообще кодировка windows-1251, я например давно перешёл только на utf-8, поддержка многоязычности.
|
12/03/2010 10:37 rvv: |
Если бы у меня была возможность использовать UTF-8 вместо windows-1251, то я бы это сделал и не поднимал вообще эту тему. Очень прошу ответить по-существу вопроса. Уже несколько дней роюсь в инете. Перечитал кучу всего про аджакс. Пока видно только одно решение - настраивать сервер, чтобы он формировал заголовок с кодовой страницей. Так что жду ответа от Макса :) |
12/03/2010 16:42 Max: |
Чего-то мне кажется что где-то вы намудрили, создав проблему из ничего. Ну неужели браузер вдруг сам станет перекодировать ответ сервера в другую кодировку чем исходная страница? И если вы положите второй файл в кодировке UTF он отобразится нормально? Ладно, в любом случае, в этом сервере, служебный заголовок HTTP для статических файлов можно положить в сам файл добавив дополнительное расширение .asi Например если у вас есть файл aa.htm переименуйте его в aa.htm.asi и в начало впишите заголовок вида: Status: 200 OK Content-Type: text/html; charset=windows-1251 <head> ... После заголовка пустая строка обязательна. Перед заголовком ничего быть не может. Заголовок должен начинаться с первого байта файла. Вместо Status: 200 можно указать HTTP/1.0 200 |
13/03/2010 06:58 rvv: |
Спасибо. ASI работает во всех броузерах. Хотя, честно говоря, переименовывать все файлы в аси и переделывать все ссылки на сайте... странное решение. Надеюсь Вы улучшите работу с заголовками в будущих версиях сервера. С уважением. |
13/03/2010 19:08 Max: |
ASI на стороне сервера, не зависимо от браузера и ссылки переделывать не надо. Если запрашивается несуществующий файл, сервер проверяет нет ли такого же с расширением .asi и если есть возвращает. Вообще это сделано для переноса файлов, т.е. если файл нужно куда-то перенести, а где-то могли остаться ссылки на него, вместо файла кладется .asi с тем же именем и в заголовоке указывается редирект на новое место. |