Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ajax - проблема с кодировкой 
:(
    Опции темы
Win MK 32
Дата 27.5.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



Я просто уже поседею скоро от таких переживаний. Почему у меня при передачи в AJAX параметра на русском языке передаются кракозябры???
Вроде все советы учел - один фиг.
ПА-МА-ГИ-ТЕ !!!

index.php:
Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>AJAX-примеры</title>
<script type="text/javascript" language="JavaScript" src="ajax.js"></script>
</head><body>

<div id="CONTAINER">
    <a onclick="PHPText('CONTAINER','php.php','var=1&text=черепаха')" href="javascript:void(0)">Нажми</a>
</div>

</body></html>

php.php:
Код

<? header("Content-Type: text/html, charset=windows-1251"); ?><pre><?
sleep(1);
print_r($_GET);
echo htmlentities($_GET['text'], ENT_NOQUOTES, 'cp1251');
?></pre>

Код

function $(elementid)
{
    return document.getElementById(elementid);
}
function CreateRequest()
{
    var Request = false;

    if (window.XMLHttpRequest)
    {
        //Gecko-совместимые браузеры, Safari, Konqueror
        Request = new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        //Internet explorer
        Request = new ActiveXObject("Microsoft.XMLHTTP");
    
        if (!Request)
        {
            HRequest = new ActiveXObject("Msxml2.XMLHTTP");
        }
    }
 
    if (!Request)
    {
        alert("Невозможно создать XMLHttpRequest");
    }
    
    return Request;
}

function SendRequest(container,r_method, r_path, r_args, r_handler){
    var Request = CreateRequest();
    if (!Request){
        return;
    }
    
    Request.onreadystatechange = function(){
            //Если обмен данными завершен
            if (Request.readyState == 4){
                    r_handler(Request);
            }else{
                    //Оповещаем пользователя о загрузке
                    container.innerHTML = "Loading...";
            }
    }
    
    if (r_method.toLowerCase() == "get" && r_args.length > 0)
    r_path += "?" + r_args;
    
    Request.open(r_method, r_path, true);
    
    if (r_method.toLowerCase() == "post"){
        //Если это POST-запрос
        
        //Устанавливаем заголовок
        Request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=windows-1251");
        //Посылаем запрос
        Request.send(r_args);
    }else{
        //Если это GET-запрос
        
        //Посылаем нуль-запрос
        Request.send(null);
    }
}

function PHPText(container,script_name,args){
    if (typeof(container) == "string"){
        container = document.getElementById(container); 
    }
    var Handler = function(Request){
        container.innerHTML = Request.responseText;
    }
    SendRequest(container,"GET",script_name,args,Handler);
}


Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  ajaxphp.zip 1,72 Kb
PM   Вверх
Veve
Дата 28.5.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: 2
Всего: 13



Этот результат вижу я:

Array
(
    [var] => 1
    [text] => черепаха
)
черепаха


У тебя что-то не так вместо слов, или я чего-то не понимаю?
PM MAIL ICQ Skype MSN   Вверх
bars80080
Дата 28.5.2009, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 44
Всего: 315



ajax работает только с utf8
надо пропускать текст и на сервере и в клиенте через кодирующие функции. на js это encodeURIComponent и decodeURIComponent
на пхп это rawurlencode и rawurldecode, плюс iconv('cp-1251', 'utf-8', $text) и наоборот

в данном случае, тебе на приёме на сервере нужно пропустить данные через iconv('utf-8', 'cp-1251', $text)
PM MAIL WWW   Вверх
youri
Дата 28.5.2009, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



Цитата(bars80080 @  28.5.2009,  00:43 Найти цитируемый пост)
ajax работает только с utf8

если не воспользоваться encodeURIComponent, ie отсылает в кодировке страницы
PM   Вверх
Win MK 32
Дата 28.5.2009, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



Veve, а у меня в обоих случаях кракозябры в Опере!

Добавлено через 10 минут и 23 секунды
bars80080, 
Цитата(bars80080 @  27.5.2009,  22:43 Найти цитируемый пост)
encodeURIComponent

плюс
Цитата(bars80080 @  27.5.2009,  22:43 Найти цитируемый пост)
rawurldecode

не помогли. Даже разницы не заметил.

Добавлено через 11 минут и 57 секунд
Цитата(bars80080 @  27.5.2009,  22:43 Найти цитируемый пост)
в данном случае, тебе на приёме на сервере нужно пропустить данные через iconv('utf-8', 'cp-1251', $text)

И строка стал пустой  smile 

Это сообщение отредактировал(а) Win MK 32 - 28.5.2009, 07:23
PM   Вверх
youri
Дата 28.5.2009, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



такой вариант у тебя работает?

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  php.rar 1,71 Kb
PM   Вверх
Win MK 32
Дата 28.5.2009, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



youri, выдает немного кракозябров: чя

Добавлено через 1 минуту и 5 секунд
В Опере, Фаерфоксе, Сафари, IE. В общем везде smile
PM   Вверх
ksnk
Дата 28.5.2009, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Более конкретно совет bars80080 выглядит так :
Код

<a onclick="PHPText('CONTAINER','php.php','var=1&text='+encodeURIComponent('черепаха'))" h...

Это обязательно, потому что кто его знает, откуда там на самом деле берутся черепахи. Может она в кавычках...

на стороне PHP может быть чего-то такое
Код

function detectUTF8($string)
{
       return preg_match('%(?:
       [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
       |\xE0[\xA0-\xBF][\x80-\xBF]          # excluding overlongs
       |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}   # straight 3-byte
       |\xED[\x80-\x9F][\x80-\xBF]          # excluding surrogates
       |\xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
       |[\xF1-\xF3][\x80-\xBF]{3}           # planes 4-15
       |\xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
       )+%xs', $string);
}

if(isset($_GET['text']) && detectUTF8($_GET['text'])){

   $_GET['text']=iconv('utf-8', 'cp1251//IGNORE', $_GET['text']);
}

print_r($_GET);
echo htmlentities($_GET['text'], ENT_NOQUOTES, 'cp1251');



Функцию detectUTF8 можно самому поискать на просторах тырнета. Она необязательна, но важна. Без нее нельзя будет написать такое в адресной строке, для проверки... Магическое слово //IGNORE при указании кодировки - обязательно, так как без него можно получить ту самую пустую строку.



Это сообщение отредактировал(а) ksnk - 28.5.2009, 08:37


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Win MK 32
Дата 28.5.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



ksnk, у меня после этого всего выводится пустая строка.
PM   Вверх
ksnk
Дата 28.5.2009, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Имя кодировки нужно писать правильно
Код

...iconv('utf-8', 'cp1251//IGNORE', $_GET['text'])...

и скобочку лишнюю я в JS забыл... поправил


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ksnk
Дата 28.5.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Чего-то я сегодня торможу... не все XmlHttp реквесты одинаково полезны. Я в том смысле, что если ВЫДАВАТЬ контент в UTF-8, то проблем будет на порядок меньше, а волосы наконец, станут шелковистыми... А хидеры, по всей видимости при таком Ajax'е идут лесом...




--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Win MK 32
Дата 28.5.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



ksnk, спасибо большое!!!
Теперь все работает так, как надо  smile 

Как же здорово было родиться англоговорящим  smile Читать самую полную википедию, научиться всему-всему-всему не изучая язык. Да еще быть непривередливым технически ко всем новым технологиям. Не говоря уже о недостатках существования в естественной среде обитания smile

Добавлено через 1 минуту и 58 секунд
Цитата(ksnk @  28.5.2009,  07:00 Найти цитируемый пост)
Чего-то я сегодня торможу... не все XmlHttp реквесты одинаково полезны. Я в том смысле, что если ВЫДАВАТЬ контент в UTF-8, то проблем будет на порядок меньше, а волосы наконец, станут шелковистыми... А хидеры, по всей видимости при таком Ajax'е идут лесом...

Ну у меня до этого поста все заработало.

Пока жить можно smile А вообще конечно хотелось бы разобраться в вопросе как можно точнее. Кодировки - дело такое, против такой магии вуду нету волшебства против кракозябр smile
PM   Вверх
ksnk
Дата 28.5.2009, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



Win MK 32, Не все так просто. Достаточно вставить в php.php оператор echo "Привет";. чтобы почувствовать, что не все в мире устроено правильно smile


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
youri
Дата 28.5.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



Цитата(Win MK 32 @  28.5.2009,  07:54 Найти цитируемый пост)
youri, выдает немного кракозябров: чя
В Опере, Фаерфоксе, Сафари, IE. В общем везде

странно, а у меня везде (ie 6, ie 7, opera 9, ff 3, ff 2, chrome) работает (windows), а если это все на сервер записать (linux), то не работает. Но зато на сервере работает такое:

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  3.rar 1,65 Kb
PM   Вверх
Win MK 32
Дата 28.5.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 492
Регистрация: 15.7.2002

Репутация: нет
Всего: нет



ksnk, а у меня это работает на всех браузерах smile

Добавлено через 9 минут и 13 секунд
youri, проверил - действительно тоже работает.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.