Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > PHP + SACK + WINDOWS-1251 = Fu...


Автор: Deg 1.3.2008, 21:02
Тема стара как мир, но допустимого решения не нашел:

JS -> PHP -> Mysql -> PHP -> JS

отправляем русский текст c input'а в 1251 , сервер принимает пишет в базу, читает с базы 1251, посылает клиенту, скрипт тулит в div

Используется:
  • Кодировка сайта: windows-1251 (не предлагать перейти на UTF-8)
  • Кодировка базы: windows-1251 (не предлагать перейти на UTF-8)
  • AJAX модуль Simple Ajax Code Kit

Цель: Поиск по сайту, реализация с использованием явыскрипта. Нужно решение именно на этом CodeKit'е, так как он маленький.

p.s. с prototype.js такого не возникает, посылание обычного header("Content-type: text/html; charset=windows-1251") хватает, а с этим - фиг


Автор: Sardar 1.3.2008, 21:21
http://www.w3schools.com/jsref/jsref_encodeURIComponent.asp -> http://php.net/rawurldecode?

Автор: Deg 1.3.2008, 22:07
Цитата(Sardar @ 1.3.2008,  21:21)
http://www.w3schools.com/jsref/jsref_encodeURIComponent.asp -> http://php.net/rawurldecode?

С возвратом результата - все класс, спасибо. Но вот encodeURIComponent передала все нормально в кодах с %, вот только что с ними там делать? PHP-исходник в ANSI

Автор: Sardar 1.3.2008, 22:11
Цитата(Deg @  1.3.2008,  21:07 Найти цитируемый пост)
Но вот encodeURIComponent передала все нормально в кодах с %, вот только что с ними там делать?

Глянь снова на функцию rawurldecode, попробуй почитать мануал.

Автор: Deg 1.3.2008, 22:26
Цитата(Sardar @ 1.3.2008,  22:11)
Цитата(Deg @  1.3.2008,  21:07 Найти цитируемый пост)
Но вот encodeURIComponent передала все нормально в кодах с %, вот только что с ними там делать?

Глянь снова на функцию rawurldecode, попробуй почитать мануал.

Да вроде нормально читаю...

клиент кодирует строку руссо в %D1%80%D1%83%D1%81%D1%81%D0%BE

Код

encodeURIComponent('руссо');


Код

echo (" ".$_POST['key1']);


Но вот 
Код

echo rawurldecode($_POST['key1']);


превращает его в СЂСѓСЃСЃРѕ

Где я натупил?

Добавлено через 14 минут и 17 секунд
Тупка найдена, в начале обработчика на php убрал (как не странно) 
Код

header("Content-type: text/html; charset=windows-1251");
 и все запахало, благодарю Вас, Sardar, тему считаю закрытой smile 

Автор: Deg 1.3.2008, 22:49
Опять затупил...


Когда делаем вот так:
Код

echo urldecode($_POST['key1']);
echo (" руссо");

получаем: руссо ����, т.е. то что пришло с JS - декодилось, а то что echo ("руссо"); - бред!!!!

А когда делаем вот так:
Код

@header("Content-type: text/html; charset=WINDOWS-1251"); 
echo urldecode($_POST['key1']);
echo ("руссо");

Выдает вот такое: СЂСѓСЃСЃРѕ руссо

Как быть?

Автор: Deg 1.3.2008, 23:44
Нашел выход, да вот глупый до горя, так как думаю что изобрел велик явно не в первый раз, и есть выход с аналогичным результатом и не такой геморный:

Файл в ANSI и в него отправляю encodeURIComponent('руссо'), обрабатываю вот этимс:

Код

@header("Content-type: text/html; charset=WINDOWS-1251"); 
function decoder($str) {
$ansi = array('а','б','в','г','д','е','ё','ж','д','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я','А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я');
$ansi_1 = array('%E0','%E1','%E2','%E3','%E4','%E5','%B8','%E6','%E7','%E8','%E9','%EA','%EB','%EC','%ED','%EE','%EF','%F0','%F1','%F2','%F3','%F4','%F5','%F6','%F7','%F8','%F9','%FA','%FB','%FC','%FD','%FE','%FF','%C0','%C1','%C2','%C3','%C4','%C5','%A8','%C6','%C7','%C8','%C9','%CA','%CB','%CC','%CD','%CE','%CF','%D0','%D1','%D2','%D3','%D4','%D5','%D6','%D7','%D8','%D9','%DA','%DB','%DC','%DD','%DE','%DF');
$ansi_2 = array('%D0%B0','%D0%B1','%D0%B2','%D0%B3','%D0%B4','%D0%B5','%D1%91','%D0%B6','%D0%B7','%D0%B8','%D0%B9','%D0%BA','%D0%BB','%D0%BC','%D0%BD','%D0%BE','%D0%BF','%D1%80','%D1%81','%D1%82','%D1%83','%D1%84','%D1%85','%D1%86','%D1%87','%D1%88','%D1%89','%D1%8A','%D1%8B','%D1%8C','%D1%8D','%D1%8E','%D1%8F','%D0%90','%D0%91','%D0%92','%D0%93','%D0%94','%D0%95','%D0%81','%D0%96','%D0%97','%D0%98','%D0%99','%D0%9A','%D0%9B','%D0%9C','%D0%9D','%D0%9E','%D0%9F','%D0%A0','%D0%A1','%D0%A2','%D0%A3','%D0%A4','%D0%A5','%D0%A6','%D0%A7','%D0%A8','%D0%A9','%D0%AA','%D0%AB','%D0%AC','%D0%AD','%D0%AE','%D0%AF');
    if (!empty($str)) {
        if (substr($str,0,2) == "%D") return str_replace($ansi_2,$ansi,$str); else return str_replace($ansi_1,$ansi,$str);
    } else return '';
} 

echo ($_POST['key1'])."<BR />";
echo ("руссо")."<BR />";
echo decoder($_POST['key1'])."<BR />";


и вот результат:
Код

%D1%80%D1%83%D1%81%D1%81%D0%BE
руссо
руссо


Вот теперь Ваши коментарии по поводу моего корявого кода smile

Автор: Sardar 2.3.2008, 00:17
Цитата(Deg @  1.3.2008,  21:26 Найти цитируемый пост)
превращает его в СЂСѓСЃСЃРѕ

Какая кодировка удваивает кириллицу и в ANSI выглядит каракулями? UTF-8
echo iconv("UTF-8", "CP1251", urldecode($_POST['key1']));

Автор: Deg 2.3.2008, 00:46
Цитата(Sardar @  2.3.2008,  00:17 Найти цитируемый пост)
iconv("UTF-8", "CP1251", urldecode($_POST['key1'])); 


...и еще разок спасибо. Приятно иметь дело с профи  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)