|
Страница 1 из 1 [ Сообщений: 19 ] |
Автор |
Сообщение |
Konyukhov
новый человек
|
|
Тема уже наверное избитая... но поиски однозачного ответа не дали. Суть в следующем. При отправке формы методом POST с помощью AJAX, когда формирую строку параметров (переменных) формы, в серверный скрипт он приходят закодированные (%xxxx), если встречаются русские буквы. Соответственно, их нужно там декодировать. К сожалению, стандартной PHP-функции для этого дела нет.
Нашел написанную кем-то функцию, urldeciode, которая корректно работает с русскими буквами. Но только в том случае, если в слове только русские буквы, или только не_русские буквы. Если мешанина - получается фигня.
Тип содержания формы: multipart/form-data
Пробовал не escap-ить, результат такой же.
Как быть?
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
 |
|
 |
Jamakaser
участник
|
|
Konyukhov писал(а): | Если мешанина - получается фигня.
|
Забавно. И что за фигня получается?
_________________ Найди кликабельный пиксель -->
|
|
 |
|
 |
Konyukhov
новый человек
|
|
Jamakaser, закодированные (%xxxx)
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
 |
|
 |
Jamakaser
участник
|
|
Konyukhov,
Пример можно?
_________________ Найди кликабельный пиксель -->
|
|
 |
|
 |
Crazy
Модератор
|
|
Konyukhov писал(а): | Нашел написанную кем-то функцию |
Напоминаю еще раз: телепаты в отпуске. Где исходник функции?
|
|
 |
|
 |
Konyukhov
новый человек
|
|
Код: function unescape($str) { $escape_chars = "0410 0430 0411 0431 0412 0432 0413 0433 0490 0491 0414 0434 0415 0435 0401 0451 0404 0454 0416 0436 0417 0437 0418 0438 0406 0456 0419 0439 041A 043A 041B 043B 041C 043C 041D 043D 041E 043E 041F 043F 0420 0440 0421 0441 0422 0442 0423 0443 0424 0444 0425 0445 0426 0446 0427 0447 0428 0448 0429 0449 042A 044A 042B 044B 042C 044C 042D 044D 042E 044E 042F 044F"; $russian_chars = "А а Б б В в Г г Ґ ґ Д д Е е Ё ё Є є Ж ж З з И и І і Й й К к Л л М м Н н О о П п Р р С с Т т У у Ф ф Х х Ц ц Ч ч Ш ш Щ щ Ъ ъ Ы ы Ь ь Э э Ю ю Я я"; $e = explode(" ",$escape_chars); $r = explode(" ",$russian_chars); $rus_array = explode("%u",$str); $new_word = str_replace($e,$r,$rus_array); $new_word = str_replace("%20"," ",$new_word); return (implode("",$new_word)); }
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
 |
|
 |
Crazy
Модератор
|
|
Konyukhov писал(а): | Но только в том случае, если в слове только русские буквы, или только не_русские буквы. Если мешанина - получается фигня. |
Ты говоришь направду. Берем контрольный пример:
Код: echo unescape("Rus: %u0410%u0430 Lat: abc"); Получаем нормальный ответ: Код: Rus: Аа Lat: abc В действительности ошибка здесь одна: не декодируются двузначные коды вида %XX: Код: echo unescape("Rus: %u0410%u0430 Lat: abc%21%22"); Получаем: Код: Rus: Аа Lat: abc%21%22 Другого ожидать было бы странно. Ошибка очевидна: Код: $new_word = str_replace("%20"," ",$new_word);
Впредь советую говорить НАСТОЯЩЕЕ описание проблемы (с примерами кода), а не свои фантазии.
|
|
 |
|
 |
Konyukhov
новый человек
|
|
Crazy, проблема выскочила на Р40102 №215, где первая буква - русская. Результирующую кракозяблу приводить уже не буду, потому как ошибку ты обнаружил, а я тем временем решил проблему "в обход"… оказалось банально просто:
При передаче параметра из JS в AJAX вообще не использовал ulrencode, а со стороны сервера сделал
Код: function decode_ajax( $str ) { return iconv ( 'UTF-8', 'CP1251', $str); }
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
 |
|
 |
Crazy
Модератор
|
|
Konyukhov писал(а): | Crazy, проблема выскочила на Р40102 №215 |
Как выгледела исходная строка до применение unescape? В приведенной тобой вообще нет квотинга.
P.S. Не вижу, какое отношение decode_ajax имеет к unescape. Они вроде как не одно и то же делают.
|
|
 |
|
 |
Konyukhov
новый человек
|
|
Crazy, я привел как раз исходную. Именно этой строке я делал escape(), потом php unescape, и получалась кака. Теперь все ОК.
Цитата: | Не вижу, какое отношение decode_ajax имеет к unescape. Они вроде как не одно и то же делают. |
Дык я ж говорю, что перестал делать вводимому в textarea тексту escape, прямо так его и отправляю в ajax. А в PHP уже делаю decode_ajax.
Код: $.ajax({ type: "POST", url: "/plan/adm/process.php", data: "name="+document.addwork.name.value+"&cmt="+document.addwork.cmt.value+"&object=" +document.addwork.object.value+"&to_general="+general+"&cmd="+cmd+"&wid=" +document.addwork.wid.value+"&guid="+document.addwork.guid.value+"&xyz="+Math.random(), async: false });
и в PHP Код: $name = decode_ajax($_POST['name']); $cmt = decode_ajax($_POST['cmt']); $object = decode_ajax($_POST['object']);
и т.д.
P.S. уже и не помню, зачем я лепил эти escape() в JS, в случае отправки формы в скрипт по submit все передается и так хорошо. 
_________________ Лишь одно в моём кармане - беспонтовый пирожок
Последний раз редактировалось Konyukhov 7 Февраль 2008, 06:59:28, всего редактировалось 1 раз.
|
|
 |
|
 |
Konyukhov
новый человек
|
|
Crazy, от жеж )))
Ну вообще навряд ли туда что-нибудь напишут с "&", но смысл понятен, надо опять думать.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
 |
|
 |
Crazy
Модератор
|
|
Konyukhov писал(а): | Ну вообще навряд ли туда что-нибудь напишут с "&" |
Без комментариев.
|
|
 |
|
 |
Бaзиль
участник
|
|
Konyukhov писал(а): | CrazyНу вообще навряд ли туда что-нибудь напишут с "&", но смысл понятен, надо опять думать. |
дааа?
и DDoS-атаки тоже сами по себе появились, и брутфорсы и прочие зловония?
_________________ Не кочегары мы, не плотники,
Но сожалений горьких нет -
Как нет?
А мы дизайнеры-художники,
И с высоты вам шлем привет -
Привет!
|
|
 |
|
 |
Konyukhov
новый человек
|
|
Crazy, Бaзиль, сайт внутрикорпоративный.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
 |
|
 |
Бaзиль
участник
|
|
а вообще вот.
использовал функцию encodeURIComponent. В РНР (там виндовая кодировка на сервере, а жабаскрипт все в юникоде посылает) делал так:
$blabla=utf2win(stripcslashes($_POST["blabla"]));
соотвесснно, вот и сама функция:
Код: <?
function utf2win ($s) { $out = "";
for ($i=0; $i<strlen($s); $i++) { $c1 = substr ($s, $i, 1); $byte1 = ord ($c1); if ($byte1>>5 == 6) { $i++; $c2 = substr ($s, $i, 1); $byte2 = ord ($c2); $byte1 &= 31; $byte2 &= 63; $byte2 |= (($byte1 & 3) << 6); $byte1 >>= 2;
$word = ($byte1<<8) + $byte2; if ($word==1025) $out .= chr(168); elseif ($word==1105) $out .= chr(184); elseif ($word>=0x0410 && $word<=0x044F) $out .= chr($word-848); else { $a = dechex($byte1); $a = str_pad($a, 2, "0", STR_PAD_LEFT); $b = dechex($byte2); $b = str_pad($b, 2, "0", STR_PAD_LEFT); $out .= "&#x".$a.$b.";"; } } else { $out .= $c1; } }
return $out; }
function win2utf($s) { $t = ''; for($i=0, $m=strlen($s); $i<$m; $i++) { $c = ord($s[$i]); if ($c<=127) {$t.=chr($c); continue; } if ($c>=192 && $c<=207) {$t.=chr(208).chr($c-48); continue; } if ($c>=208 && $c<=239) {$t.=chr(208).chr($c-48); continue; } if ($c>=240 && $c<=255) {$t.=chr(209).chr($c-112); continue; } if ($c==184) { $t.=chr(209).chr(209); continue; }; if ($c==168) { $t.=chr(208).chr(129); continue; }; } return $t; } ?>
нарыл где-то на просторах инета. Правда, че-то там пришлось подправить...вроде
...и отдавал жабаскрипту.
не помню, может что-то я и упустил, но вроде так.
оффтопик: давненько не брал в руки шашек...все так, PDF-ку сваять или еще что-то совсем утилитарное...
_________________ Не кочегары мы, не плотники,
Но сожалений горьких нет -
Как нет?
А мы дизайнеры-художники,
И с высоты вам шлем привет -
Привет!
|
|
 |
|
 |
Konyukhov
новый человек
|
|
Crazy, надо быть добрее к людям. Тогда и личная жизнь, глядишь, наладится. Жалость свою сами знаете куда девать, я думаю.
По теме: если я не считаю необходимым что-то делать, я это не делаю. И в этом есть сермяжная правда - я вполне способен оценить, к чему именно могут привести мои действия или не_действия. А если совсем по теме - напишут "&" - буду что-то делать. Но не раньше. А в том, что напишут (я, видите ли, некоторым образом представляю, ЧТО конктретно пишут в эти textarea и КТО туда имеет право писать) я сильно сомневаюсь. Если только я их попрошу это сделать или напишу сам.
_________________ Лишь одно в моём кармане - беспонтовый пирожок
|
|
 |
|
 |
|
Страница 1 из 1 [ Сообщений: 19 ] |
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
|
|