Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » [решено] декодирование в php после javascript:encode

Ответить
Настройки темы
[решено] декодирование в php после javascript:encode

Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


при передаче данных в XMLHTTPRequest из javascript русские символы из кодировки 1251 приходят в php в некоей кодировке, которую называют iso8859-1 (в доках по php), хотя на самом деле русские символы присутствуют только в iso8859-5. может это и одно и то же, однако обратно они приходят в ней же, а нифига не в 1251. iconv и прочие конверторы использовать не имею ни желания ни возможности - на локальной машине их нет, а я добавлять чего-либо не умею и не надо меня этому учить. а на сервере и играться как-то кощунственно и туда тоже надо доставлять дополнительные расширения. потом... возможно ведь и использование пользователями других символов, которые не будут входить уже в iso8859-5. следовательно перед отправкой я делаю строке encode в javascript`е. все символы (русские) приходят в виде %u0... для их переконвертации я написал свой обработчик:
PHP код: Выделить весь код

function global_decode(

    
$str
) {
    return 
strtr($str, array(
        
'%u0401' => 'Ё',

        
'%u0410' => 'А',
        
'%u0411' => 'Б',
        
'%u0412' => 'В',
        
'%u0413' => 'Г',
        
'%u0414' => 'Д',
        
'%u0415' => 'Е',
        
'%u0416' => 'Ж',
        
'%u0417' => 'З',
        
'%u0418' => 'И',
        
'%u0419' => 'Й',
        
'%u041A' => 'К',
        
'%u041B' => 'Л',
        
'%u041C' => 'М',
        
'%u041D' => 'Н',
        
'%u041E' => 'О',
        
'%u041F' => 'П',
        
'%u0420' => 'Р',
        
'%u0421' => 'С',
        
'%u0422' => 'Т',
        
'%u0423' => 'У',
        
'%u0424' => 'Ф',
        
'%u0425' => 'Х',
        
'%u0426' => 'Ц',
        
'%u0427' => 'Ч',
        
'%u0428' => 'Ш',
        
'%u0429' => 'Щ',
        
'%u042A' => 'Ъ',
        
'%u042B' => 'Ы',
        
'%u042C' => 'Ь',
        
'%u042D' => 'Э',
        
'%u042E' => 'Ю',
        
'%u042F' => 'Я',
        
'%u0430' => 'а',
        
'%u0431' => 'б',
        
'%u0432' => 'в',
        
'%u0433' => 'г',
        
'%u0434' => 'д',
        
'%u0435' => 'е',
        
'%u0436' => 'ж',
        
'%u0437' => 'з',
        
'%u0438' => 'и',
        
'%u0439' => 'й',
        
'%u043A' => 'к',
        
'%u043B' => 'л',
        
'%u043C' => 'м',
        
'%u043D' => 'н',
        
'%u043E' => 'о',
        
'%u043F' => 'п',
        
'%u0440' => 'р',
        
'%u0441' => 'с',
        
'%u0442' => 'т',
        
'%u0443' => 'у',
        
'%u0444' => 'ф',
        
'%u0445' => 'х',
        
'%u0446' => 'ц',
        
'%u0447' => 'ч',
        
'%u0448' => 'ш',
        
'%u0449' => 'щ',
        
'%u044A' => 'ъ',
        
'%u044B' => 'ы',
        
'%u044C' => 'ь',
        
'%u044D' => 'э',
        
'%u044E' => 'ю',
        
'%u044F' => 'я',

        
'%u0451' => 'ё',

        
'%u2116' => '№',

# а этим я конвертил из iso8859

        
chr(208).chr(129) => 'Ё',

        
chr(208).chr(144) => 'А',
        
chr(208).chr(145) => 'Б',
        
chr(208).chr(146) => 'В',
        
chr(208).chr(147) => 'Г',
        
chr(208).chr(148) => 'Д',
        
chr(208).chr(149) => 'Е',
        
chr(208).chr(150) => 'Ж',
        
chr(208).chr(151) => 'З',
        
chr(208).chr(152) => 'И',
        
chr(208).chr(153) => 'Й',
        
chr(208).chr(154) => 'К',
        
chr(208).chr(155) => 'Л',
        
chr(208).chr(156) => 'М',
        
chr(208).chr(157) => 'Н',
        
chr(208).chr(158) => 'О',
        
chr(208).chr(159) => 'П',
        
chr(208).chr(160) => 'Р',
        
chr(208).chr(161) => 'С',
        
chr(208).chr(162) => 'Т',
        
chr(208).chr(163) => 'У',
        
chr(208).chr(164) => 'Ф',
        
chr(208).chr(165) => 'Х',
        
chr(208).chr(166) => 'Ц',
        
chr(208).chr(167) => 'Ч',
        
chr(208).chr(168) => 'Ш',
        
chr(208).chr(169) => 'Щ',
        
chr(208).chr(170) => 'Ъ',
        
chr(208).chr(171) => 'Ы',
        
chr(208).chr(172) => 'Ь',
        
chr(208).chr(173) => 'Э',
        
chr(208).chr(174) => 'Ю',
        
chr(208).chr(175) => 'Я',
        
chr(208).chr(176) => 'а',
        
chr(208).chr(177) => 'б',
        
chr(208).chr(178) => 'в',
        
chr(208).chr(179) => 'г',
        
chr(208).chr(180) => 'д',
        
chr(208).chr(181) => 'е',
        
chr(208).chr(182) => 'ж',
        
chr(208).chr(183) => 'з',
        
chr(208).chr(184) => 'и',
        
chr(208).chr(185) => 'й',
        
chr(208).chr(186) => 'к',
        
chr(208).chr(187) => 'л',
        
chr(208).chr(188) => 'м',
        
chr(208).chr(189) => 'н',
        
chr(208).chr(190) => 'о',
        
chr(208).chr(191) => 'п',

        
chr(209).chr(128) => 'р',
        
chr(209).chr(129) => 'с',
        
chr(209).chr(130) => 'т',
        
chr(209).chr(131) => 'у',
        
chr(209).chr(132) => 'ф',
        
chr(209).chr(133) => 'х',
        
chr(209).chr(134) => 'ц',
        
chr(209).chr(135) => 'ч',
        
chr(209).chr(136) => 'ш',
        
chr(209).chr(137) => 'щ',
        
chr(209).chr(138) => 'ъ',
        
chr(209).chr(139) => 'ы',
        
chr(209).chr(140) => 'ь',
        
chr(209).chr(141) => 'э',
        
chr(209).chr(142) => 'ю',
        
chr(209).chr(143) => 'я',

        
chr(209).chr(145) => 'ё',

        
'в„–' => '№',
#        '&' => '&',
    
));


всё бы ничего, но
- пропадает символ '+' (плюс) - передается в виде пробела
- все-таки хотелось бы нечто универсальное для любого юникода - не только кирилистического - вычислять разницу в кодах символов разных кодировок, я так понял, глупо... этим уменьшится только количество строк php, а не логика

зы
без encode не могу - всё после символа & пропадает как новая переменная - как при методе get

Отправлено: 17:42, 25-12-2006

 

Deadooshka


Сообщения: 2511
Благодарности: 689

Профиль | Отправить PM | Цитировать


VeshchiyOleg про локаль не забываем...
PHP код: Выделить весь код

setlocale(LC_ALL,"ru_RU.CP1251"); 



Отправлено: 20:56, 25-12-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


да я пробовал локаль прописывать в .htaccess - не помогло

а куда это засунуть???
в начало скрипта???
или можно непосредственно перед обращением к переменной???
и что делать, если текст пришел уже в виде %u0...???

Отправлено: 21:14, 25-12-2006 | #3


Deadooshka


Сообщения: 2511
Благодарности: 689

Профиль | Отправить PM | Цитировать


VeshchiyOleg setlocale - ф-я PHP, соотв. лучше в начало скрипта (htaccess тут ни при делах). К тому же нужно уточнить имя локали в твоей системе (если локали системы и желаемая идентичны - передаем пустую строку). см. также тут и тут

Отправлено: 22:07, 25-12-2006 | #4


Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


setlocale после escape не помогает
setlocale вообще не помогает!!!
после отправки текста (без escape)
АБВГДЕЁЖЗИЙКЛМН
приходит
АБВГДЕЁЖЗР?ЙКЛМН
т.е. опять невесть в чем!!!

у меня возникла идея, как это сделать, но не хватает опыта:
после escape символы приходят в виде
%u0410 - (заглавное А на кирилице)
0410 - это не что иное как шестнадцатеричный код символа
т.е. если мы пересчитаем 0410 из шестнадцатеричного в десятичное число, то получим 1040
короче если привести
%u0410 к виду А
то мы получим не что иное, как нормальную html-сущность символа А на кирилице
а если после этого сделать еще и
Цитата:
html_entity_decode -- Преобразует HTML сущности в соответствующие символы
то на выходе должна появиться строка, которую вводили

вопрос КАК ЭТО СДЕЛАТЬ на php???

остается открытым вопрос:
как передавать плюсы с использованием encode???

Последний раз редактировалось VeshchiyOleg, 26-12-2006 в 10:32. Причина: нежелательное автоматическое преобразование


Отправлено: 10:28, 26-12-2006 | #5


Deadooshka


Сообщения: 2511
Благодарности: 689

Профиль | Отправить PM | Цитировать


VeshchiyOleg а как же rawurldecode()? Есть еще urldecode() но она afaik плюс в пробел декодит..

Отправлено: 16:07, 26-12-2006 | #6


Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


javascript:escape('АБВ') == '%u0410%u0411%u0412'
urldecode('%u0410%u0411%u0412') == '%u0410%u0411%u0412'
rawurldecode('%u0410%u0411%u0412') == '%u0410%u0411%u0412'

всё не то!!!

я тут сделал функцию
всё супер
с одним но...

html_entity_decode не работает как я думал

PHP код: Выделить весь код

function global_decode(

    
$str
) {

    return 
html_entity_decode(preg_replace_callback(
        
'|(?:%u.{4})|',
        
create_function(
            
'$matches',
            
'return \'&#\'.hexdec(substr($matches[0], 2)).\';\';'
        
),
        
$str
    
));


urldecode('%u0410%u0411%u0412') == 'АБВ'

на экране всё классно, но мне надо бы еще с текстом поработать прежде чем выводить

что делать дальше??? как перевести это в нормальные буквы???

Последний раз редактировалось VeshchiyOleg, 26-12-2006 в 17:28. Причина: нежелательное переформатирование символов


Отправлено: 17:27, 26-12-2006 | #7


Deadooshka


Сообщения: 2511
Благодарности: 689

Профиль | Отправить PM | Цитировать


VeshchiyOleg
Цитата:
html_entity_decode не работает как я думал
в смысле? твоя ф-я не затронет небуквенные ASCII-символы, а посему без rawurldecode не обойтись...

Отправлено: 22:42, 26-12-2006 | #8


Пользователь


Сообщения: 67
Благодарности: 5

Профиль | Сайт | Отправить PM | Цитировать


Цитата:
rawurldecode

(PHP 3, PHP 4, PHP 5)
rawurldecode -- Decode URL-encoded strings
Description
string rawurldecode ( string str )

Returns a string in which the sequences with percent (%) signs followed by two hex digits have been replaced with literal characters.
не та это функция!!!
джаваскриптовский escape приводит не к виду % и следом за ним две шестнадцатеричные цифры, а % потом u и потом ЧЕТЫРЕ шестнадцатеричные цифры!!!
а если не преобразовывать, то получается вообще какая-то абракадабра, которая никак не обрабатывается, кроме как заменой двух символов на один (см. первый пост вторую половину скрипта)
так что rawurldecode у меня ничего не меняет. ВООБЩЕ!!!

я тут стал копать глубже
оказывается, эта трабла возникает только при методе POST
при GET всё ок (без escape)

я использую для ajax`а библиотеку prototype.js v 1.4.0
там при POST отправляются следующие заголовки:

X-Requested-With:XMLHttpRequest
X-Prototype-Version:Prototype.Version
Content-type:application/x-www-form-urlencoded
Connection:close

потом собсна тело запроса

может тут собака порылась???
я уж в контент-тип и кодировку прописывал

читал статью http://phpclub.ru/detail/article/http_request
интересно, но вроде всё правильно...
за исключением того, что имитация POST`а какая-то кривая насчет русских символов

Отправлено: 15:09, 27-12-2006 | #9


Deadooshka


Сообщения: 2511
Благодарности: 689

Профиль | Отправить PM | Цитировать


VeshchiyOleg
Цитата:
escape приводит не к виду % и следом за ним две шестнадцатеричные цифры, а % потом u и потом ЧЕТЫРЕ шестнадцатеричные цифры!!!
RTFM. К виду %uxxxx приводятся символы со значением больше 255, а к виду %xx приводятся небуквенные символы (типа пробелов, кавычек). Вот как раз для второго случая тебе и нужен rawurldecode (поскольку твоя ф-я затрагивает только первый случай)...

Отправлено: 16:35, 27-12-2006 | #10



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » [решено] декодирование в php после javascript:encode

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как передать в javascript данные массива, полученного из кода на php vagner_HATE Вебмастеру 1 18-06-2009 13:51
Проверка данных пользователя (PHP + JavaScript или Ajax) darksmoke Вебмастеру 2 15-06-2009 17:28
Ошибка - [решено] Invalid argument to date encode ПЕПЕЛАЦ13 Microsoft Windows 2000/XP 9 03-12-2008 15:05
Передача переменной из PHP в JavaScript rulllesss Вебмастеру 1 25-07-2005 09:27
Вывод в файл на JavaScript (заголовок исправлен после уточненния у автора) Surround Вебмастеру 8 26-07-2004 14:26




 
Переход