?

Log in

No account? Create an account
 
 
21 Август 2009 @ 14:55
Извечная проблема с кодировкой  
Добрый день!
Прочитал достаточно статей на выше указанную тему, но так и не смог разобраться (возможно моя база знаний не дотаточна), по этому расчитываю на Вашу помощь.

Суть проблемы:
Сайт (php+mysql) в некоторых моментах использует ajax: функция javascript запрашивает php-скрипт, который вводит данные, но в неправильной кодировке.

Читал, что проблема может решается 2-мя способами:
1. Строкой: header("Content-type: text/html; charset=windows-1251"); , которая вставляется в php-скрипт. Но у меня это вызывает такую ошибку: "Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\head.php:6) in Z:\home\localhost\www\out_cat.php on line 47"
2. Перекодировкой "на лету" в самих скриптах. Тут мои попытки тоже не увенчались успехом.

Если не трудно, не могли бы кто-то "разжевать" ситуацию, если можно - с примерами.
Буду очень признателен за помощь.
 
 
 
Человек-без-прошлогоsontar on Август, 21, 2009 11:56 (UTC)
Кодировка данных в базе, файлов php-html-js и данных в браузере должна быть одинаковой.
wrollingwrolling on Август, 21, 2009 11:58 (UTC)
Она везде windows-1251
Но, насколько я в курсе, ajax возвращает только utf-8
Человек-без-прошлогоsontar on Август, 21, 2009 11:59 (UTC)
что значит ajax возвращает? ajax - это js-запрос и php-ответ
wrollingwrolling on Август, 21, 2009 12:06 (UTC)
вот функция Javascript, которая вызывает php-скрипт:
function show_cat(str)
{
xmlhttp=GetXmlHttpObject();
if (xmlhttp==null)
{
alert ("Browser does not support HTTP Request");
return;
}
var url="out_cat.php";
url=url+"?cats="+str;
xmlhttp.onreadystatechange=stateChanged;
xmlhttp.open("GET",url,true);
xmlhttp.send(null);
}

Вот фрагмент "out_cat.php":
echo '<option ... >---Выберите рубрику ---';

SELECT с фразой "---Выберите рубрику ---" отображается в неправильной кодировке (написан в windows-1251), не говоря уже о данных из БД
Человек-без-прошлогоsontar on Август, 21, 2009 12:09 (UTC)
1. передайте строку с кириллицей напрямую из php
2. какую кодировку в заголовке выдаёт апач?
wrollingwrolling on Август, 21, 2009 12:13 (UTC)
>>1. передайте строку с кириллицей напрямую из php

Если этот код вызвать на прямую из php (не через функцию javascript), то все выводится правильно. (если я Вас правильно понял)

>>2. какую кодировку в заголовке выдаёт апач?
Как это посмотреть?
Человек-без-прошлогоsontar on Август, 21, 2009 12:18 (UTC)
1. значит у вас проблема в кодировке при подключении к базе
надо сразу после mysql_select_db сделать запросы
"SET NAMES 'cp1251'"
"SET CHARACTER SET 'cp1251'"
"SET collation_connection='cp1251_general_ci'"
ну или в какой там кодировке у вас данные хранятся

2. http-снифером смотрят обычно - HTTPAnalyzer, HTTPLook, Firebug (для FF).
wrollingwrolling on Август, 21, 2009 12:27 (UTC)
БД в cp1251 была и есть изначально.

Обратите внимание, что "echo 'Выберите рубрику';" не берет данные в БД, но выводится тоже неправильно.
Человек-без-прошлогоsontar on Август, 21, 2009 12:34 (UTC)
Первый год кодите, да?

БД в cp1251 не означает что данные будут получены в этой же кодировке. Впрочем Вы б заметили.

В общем проверяйте всё шаг за шагом - кодировку соединения с базой, кодировку php-файлов, кодировку, которую сообщает апач.
Можете ещё попробовать другой js-фреймворк для аякса. jshttpquery или jquery.
wrollingwrolling on Август, 21, 2009 12:47 (UTC)
jquery давно уже хочется попробовать, но уже слишком много работы сделано, чтобы переписывать.

Я пробовал библиотеку xajax. Но она не не подошла в одном моменте - необходимо было вызывать рекурсивно некоторые функции, с чем xajax не справился.
Человек-без-прошлогоsontar on Август, 21, 2009 12:51 (UTC)
ну с жквери просто всё

$(document).post(
'file.php',
{/* данные */}
function($data){
// обрабатываем полученные с сервера данные, ассоциативный массив $data
},
'json'
);
Человек-без-прошлогоsontar on Август, 21, 2009 12:55 (UTC)
> Но, насколько я в курсе, ajax возвращает только utf-8

Вспомнил. библиотека Котерова jshttprequest может работать с cp1251, но она использует собственную функцию перекодировки. так что наверное Вы правы. попробуйте её
wrollingwrolling on Август, 21, 2009 13:03 (UTC)
а jquery работает с cp1251?
Человек-без-прошлогоsontar on Август, 21, 2009 13:05 (UTC)
не пробовал, не знаю. я в последних проектах использую только utf-8, удобно.
Сергей Сергеевgurugray on Август, 21, 2009 12:54 (UTC)
отдавайте на ajax запрос в utf — должно вам помочь
zikovzikov on Август, 25, 2009 05:36 (UTC)
Строку header("Content-type: text/html; charset=windows-1251"); надо вставлять в самое начало php-скрипта. До того, как начинается любая выдача. А у вас судя по всему где-то инклудится файл head.php, который уже начинает выдачу. Т.е. заголовок надо вставлять до этого инклуда.
(Анонимно) on Октябрь, 9, 2009 03:57 (UTC)
Ну не умеет AJAX работать с кодировками, отличными от UTF-8
Сделайте в скрипте, который запрашивается через AJAX-запрос, перекодировку данных и не мучайтесь:

$text = iconv('CP1251', 'UTF-8', $text);
wrollingwrolling on Октябрь, 9, 2009 06:32 (UTC)
Я воспользовался советом sontar и переписал все на jshttprequest. Пока не жалуюсь.
msk01 on Ноябрь, 1, 2009 01:55 (UTC)
Из интереса взглянул на этот проект и увидел, что вместо нескольких строчек перекодирующей функции вы получили 25Кб мудреного php-кода, суть которого сводится к той же перекодировке и минимум 15Кб js-кода, который грузят ваши пользователи.