AJAX, Internet Explorer, PHP, MySQL
1. Файл index.html. В нем есть функция, делающая http-запрос на сервер. Страница в кодировке utf-8:
[HTML]
<head>
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="STYLESHEET" type="text/css" href="/style.css">
<script src="/function.js" type="text/javascript"></script>
</head>
[/HTML]
Запрос, как я понимаю, делается тоже в кодировке UTF-8.
2. Есть сервер. Линус. Апач.
3. На сервере есть файл do.php. Тоже переконвертирован в utf-8. И есть там пятой строкой такая:
Код:
header("Content-type: text/html; charset=utf-8");
4. Там же на сервере есть файл .htaccess со строкой:
Код:
AddDefaultCharset UTF-8
Это, чтобы на сервере апач не конвертил все в Windows-1251.
5. Есть база данных MySQL. В которой указана кодировка utf-8, В ней есть табличка user, в которой указана точно такая же кодировка utf-8.
Теперь что делаем.
Делаем регистрацию пользователя.
1. В файле HTML есть форма для регистрации, в которой есть поля Имя, Мыло, Пароль. При нажатии на кнопку делается HTTP-запрос на сервер к файлу do.php. Передается все с помощью GET (в коде javascript):
Код:
http_request.open('GET', service_url, true);
service_url - это ссылка на скрипт do.php с параметрами в командной строке, т.е. типа:
Код:
do.php?mode=register&login=Михалыч&password=parol&mail=lalala@do.com
2. Файл do.php получает данные из командной строки и добавляет их в базу данных MySQL в табличку user.
Теперь проблема:
При работе в FireFox все происходит нормально. Делаем запрос, информация добавляется в базу данных и при вводе в качестве логина "Михалыч"(русскими буквами), в базе данных написано "Михалыч". Если же это делать в IE, то все тоже происходит нормально, но в базе данных вместо "Михалыч" написана всякая фигня.
Что с этим можно сделать?
А как ты просматриваешь "что в базе"?
1. Когда вывожу на страницу содержимое переменной. То, что сделано в FireFox все работает нормально. То, что сделано в IE, не работает нигде.
2. Через MySQL Front. Там отображается каракулями в обоих случаях. Но я вижу, что каракули разные для одинаковой строки.
В общем я решил проблему следующим образом:
1. При передаче, содержимое переменной login заменяем на escape(login), получается последовательность, типа:
Код:
%CC%E8%F5%E0%EB%FB%F7
И строка запроса, типа
Код:
do.php?mode=register&login=%CC%E8%F5%E0%EB%FB%F7&password=parol&mail=lalala@do.com
А в файле do.php написал функцию, которая заменяет escape-символы на нормальные. В соответствии с таблицей подстановок.
НО. Мне хотелось бы выяснить суть проблемы. Мне кажется, что IE хреново передает данные через запрос http. Возможно он передает данные не в utf-8, а в windows-1251.
Есть мысли по этому поводу? Хотелось бы обойтись в работе без всякого рода заплаток, типа функции escape(); Может можно решить проблему намного проще?
Передача пароля на сервер через адресную строку... это что-то новое...
Уважаемый. Во первых это регистрация. И пароль как-то все-таки передается. Во вторых это не относится к теме разговора вроде как. То, что я написал, я написал упрощенно, для понимания.
Только я не использовал AJAX, а стандартний метод POST для форми.
И когда я сохранял спецсимволи под IE они били бредовими в БД.
Тогда я поставил в блок head:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
и ето помогло, может когда ти делаеш запрос c помощю AJAX он не принимает во внимание <meta>, или может потому что метод GET. Я не знаю - нужно поексперементировать!!!
Цитата:
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
Но это не мешает IE игнорировать его.
1) AJAX новая технология и я не знаю как делается запрос (нету времени чтоби все просмотреть, доследить). Может там действительно хардкодно используется windows-1251.
2) Може IE что-то делает не так при запросе.
Я же написал - нада поексперементировать.
Попробуй например метод POST сделать. Или попробуи без AJAX что-то сделать, что-би посмотреть что будет???!!!
Без аякса все естественно работает. Уже делал. Теперь решил с аяксом.
Ну тогда попробуи метод POST, или посмотри может есть какие-то дополнительние функции для настроики http_request.
1) Убедись что ВСЕ, АБСОЛЮТНО все файлы участвующие в работе написаны в кодировке UTF-8
2) Используй метод POST
3) Убедись что в IE стоит автоматический выбор кодировки
4) Посмотри какие заголовки присылает сервер и какие отправляет браузер - в ФФ есть плагин для этого
Во-первых, escape() как раз и служит для корректной передачи данных, во вторых, AJAX - новая технология (читайте справочники, ничё нового, просто раньше не юзали), так вот, при работе с AJAX вы ведь юзаете XML, вот от сюда и отталкивайтесь <?xml encoding="utf-8"?> + escape и никаких проблем
Повторюсь, escape - это не лишняя заплатка, так надо! оно для этого и создано, эта ситауация, для этой функции
Но спасибо за совет.
А есть в PHP стандартная функция, которая деэксейпит текст?
[/QUOTE]
Покажи как пробовал.
Для js все равно какие теги обрабатывать.
ЗЫ В осле вообще XSLT встроен, правда не стандартный.
С XML давно уже было. Исходник уже давно был пересохранен для работы с текстом. Так что показать не могу.
Мда...как все грустно...
var req;
function loadXMLDoc(url)
{
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
// ...
// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
// ...
}
}
}
Умышлено привёл не всю, чтобы только подчеркнуть разницу реализации в различных браузеров, а ваще начните с этой статьи Там есть полно ссылок или хотя бы поюзайте goolge
Кстати а какого вида крякозябры?! Приведи пример. Я кажется знаю в чем у тебя проблема. И какую библиотеку для реализации AJAX используешь?
var req;
function loadXMLDoc(url)
{
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
// ...
// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
// ...
}
}
}
Умышлено привёл не всю, чтобы только подчеркнуть разницу реализации в различных браузеров, а ваще начните с этой статьи Там есть полно ссылок или хотя бы поюзайте goolge[/QUOTE]
Полностью согласен, ещё статья. Здесь неплохо написано про технологию и даны примеры реализации. Также хорошо объяснено то, каким образом происходит работа скрипта в разных браузерах.