Форум

/ домой \ \ темы /



Тема: CharsetDefault

09/03/2010 16:43 rvv:
Добрый день.
Подскажите пожалуйста, как решить следующую проблему.
У меня сайт построен с элементами аджакса, динамическая подгрузка контента. Есть контент в виде html и в виде php. Если для РНР я еще могу в php.ini указать charsetdefault='windows-1251', то для html заголовки игнорируются.
Точнее, веб-сервер воспринимает для аджакс-запросов кодовую страничку в UTF8 и, естественно, отвечает темже.
Раньше у меня стоял апач, но там можно было задать кодовую страничку по умолчанию.
Возможно ли подобное зделать для SHHTPS ?

Спасибо.
10/03/2010 10:41 Kinsler:
это вина твоего обозревателя. Похожие проблемы испытываю при использовании FireFox.
10/03/2010 11:17 rvv:
Я и говорю, что для аджакс-запросов через XMLHttpRequest() или ActiveXObject("Microsoft.XMLHTTP"), используется UTF-8. Там нельзя иначе (хотя может я чего и не знаю).
Пока, кроме апача, я не нашел веб-сервер, который позволял бы выставить кодовую страницу по-умолчанию. Для апача директива: AddDefaultCharset WINDOWS-1251
Вот и спрашиваю, можно ли зделать аналогично для Small HTTP Server
10/03/2010 12: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 17: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 22:41 Max:
В данном случае ничего добиваться не надо. Значение имеет только кодировка исходного документа и кодировки просто должны совпадать. Весь документ (и исходный и дальнейшии модификации) должны быть в одной и той же кодировке.
10/03/2010 23: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 23:22 rvv:
P.S. Просто скажите, что надо поставить в "Advanced code for control header.", чтобы сервер передавал для всех HTML-файлов кодировку windows-1251. Я не могу разобраться в какой именно форме надо там прописывать заголовки.
11/03/2010 19: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 19:17 Max:
А сервер вообще кодировку не меняет. В какой у вас файл лежит такую он и отдает.
12/03/2010 10: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 10:58 rvv:
Возможно тема покажется Вам несущественной, но проблема русских букв и аджакса стоит в интернете довольно остро.
Неужели в таком отработанном продукте, как Small HTTP Server, нельзя ее решить.
12/03/2010 11:02 oleg25:
А зачем вообще кодировка windows-1251, я например давно перешёл только на utf-8, поддержка многоязычности.
12/03/2010 13:37 rvv:
Если бы у меня была возможность использовать UTF-8 вместо windows-1251, то я бы это сделал и не поднимал вообще эту тему.
Очень прошу ответить по-существу вопроса.
Уже несколько дней роюсь в инете. Перечитал кучу всего про аджакс. Пока видно только одно решение - настраивать сервер, чтобы он формировал заголовок с кодовой страницей.
Так что жду ответа от Макса :)
12/03/2010 19: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 09:58 rvv:
Спасибо. ASI работает во всех броузерах.
Хотя, честно говоря, переименовывать все файлы в аси и переделывать все ссылки на сайте... странное решение.
Надеюсь Вы улучшите работу с заголовками в будущих версиях сервера.

С уважением.
13/03/2010 22:08 Max:
ASI на стороне сервера, не зависимо от браузера и ссылки переделывать не надо. Если запрашивается несуществующий файл, сервер проверяет нет ли такого же с расширением .asi и если есть возвращает.

Вообще это сделано для переноса файлов, т.е. если файл нужно куда-то перенести, а где-то могли остаться ссылки на него, вместо файла кладется .asi с тем же именем и в заголовоке указывается редирект на новое место.


Пользователь: Пароль: Новый пользователь:   Запомнить пароль: