Код rawurlencode PHP не равен escape-последовательности JavaScripts! Почему?

Я понял, что когда я использовал urlencode или rawurlencode в PHP, кодируя простой символ § (абзац), я получил следующий результат: «% C2% A7».

Но когда я использую escape в Javascript для кодирования этого символа, я получаю только «% A7».

В этом случае у меня возникают проблемы с кодированием при отправке / получении данных между сервером, на котором запущен PHP, и клиентом javascript, пытающимся получить данные через ajax / jquery.

Я хочу иметь возможность писать любой текст, какой захочу. Для этого я кодирую текст и отправляю его в бэкэнд php-скрипт, экранируя данные и отправляя. Когда я получаю его, на стороне php я беру данные из mysql, делаю rawurlencode и отправляю их обратно.

Обе стороны работают в режиме UTF-8. Функция jquery ajax вызывается с "contentType: application/x-www-form-urlencoded:charset=UTF-8", сервер mysql настроен для UTF-8 как для клиента, так и для сервера, а скрипт php начинает эхо с header( "application/x-www-form-urlencoded:charset=UTF-8");

Почему PHP производит эту штуку% C2, которая генерирует символ Â на стороне javascript.

Может кому-нибудь помочь?


person NovumCoder    schedule 03.02.2011    source источник
comment
Глядя на документы PHP, можно увидеть пользователя с именем omid имел ту же проблему.   -  person Brad Christie    schedule 03.02.2011


Ответы (2)


Некоторое время назад у меня была такая же проблема, и я нашел решение:

function rawurlencode (str) {
    str = (str+'').toString();        
    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').
                                                                                    replace(/\)/g, '%29').replace(/\*/g, '%2A');
}

Код взят отсюда - http://phpjs.org/functions/rawurlencode:501 Hope это помогает.

person Radoslav Georgiev    schedule 03.02.2011
comment
Спасибо за эту информацию. Но это для стороны javascript. Сторона javascript выглядит нормально, поскольку данные правильно хранятся в моей базе данных mysql. Проблема заключается в том, чтобы получить его с моей стороны php. Поэтому мне нужно что-то в PHP, чтобы получить правильную кодировку для § - person NovumCoder; 03.02.2011
comment
ах дерьмо, только что понял. Мне нужно использовать encodeURIComponent и decodeURIComponent. Тогда кодирование и декодирование отлично работают между javascript и php. Ваш rawurlencode правильный, спасибо Радослав. - person NovumCoder; 03.02.2011

Это явно проблема кодировки:

[adrian@cheops3:~]> php -r 'echo rawurlencode(utf8_encode("§"));'
%C2%A7
[adrian@cheops3:~]> php -r 'echo rawurlencode("§");'
%A7

(терминал явно не работает в режиме utf8)

Если у вас есть буквальный § в вашем PHP-коде, убедитесь, что php-файл сохранен как UTF8.

person ThiefMaster    schedule 03.02.2011
comment
Интересный. Итак, в вашем случае rawurlencode (§); вернул только% A7. Но в моем случае я получаю% C2% A7. И вы думаете, что это происходит из-за моей кодировки файлов php. Как я могу проверить кодировку файлов? Дело в том, что даже в моем терминале я получаю% C2% A7. Так мой терминал не поддерживает UTF8? как я могу быть уверен, что это чистый utf8. моя кодировка терминалов установлена ​​на utf-8. - person NovumCoder; 03.02.2011
comment
Хм, хорошо, я сделал это: php -r 'echo rawurlencode (utf8_decode (§));' И вернул только% A7. Что это обозначает? - person NovumCoder; 03.02.2011
comment
Если вы получите% C2% A7, это UTF8; в противном случае вы получите% A7. Если вы используете vim, вы можете установить кодировку файла, используя :set fenc=utf8 (или latin1) - person ThiefMaster; 03.02.2011