Если Вы используете в своем приложении AJAX, то неизбежно возникнут проблемы с кодировкой при передаче в параметрах запроса русских букв независимо от метода (GET или POST).

Я предлагаю универсальное решение этой проблемы.

Для начала необходимо в JavaScript-e "преобразовать" Вашу переменную (пусть это будет var) функцией encodeURIComponent(), например encodeURIComponent(var)

 

Метод encodeURIComponentпреобразовывает все символы, кроме: символов латинского алфавита, десятичных цифр и

- _ . ! ~ * ' ( )
.

 

Далее в коде php осуществляем разбор значения принимаемой переменной. Далее ход действий зависит от кодировки Вашего сайта (в которой посетитель отправляет русские буквы). Если это UTF-8, то код будет выглядеть:

Код:

preg_replace('/%([0-9a-f]{2})/ie', "chr(hexdec('\\1'))", $_REQUEST['var'])

 

Если же это кодировка Windows, т.е. cp1251, то необходимо дополнительное преобразование из UTF-8 в cp1251:

Код:

iconv('utf-8','cp1251',preg_replace('/%([0-9a-f]{2})/ie', "chr(hexdec('\\1'))", $_REQUEST['var']))

Comments   

+1 # так держать ;)Guest 2013-01-11 19:00
Спасибо :roll: большое понятно и доходчиво только надо бы предупредить о том что это всё должно переприсваивать ся переменой var иначе могут не понять ;-)
Reply | Reply with quote | Quote | Report to administrator
0 # RE: AJAX и русские буквы - проблема с кодировкойGuest 2013-03-27 03:11
Везде пишут о передаче данных из Javascript в PHP. А как быть с данными, которые возвращаются из PHP в яваскрипт?
Reply | Reply with quote | Quote | Report to administrator
0 # RE: AJAX и русские буквы - проблема с кодировкойEcolora 2013-03-27 04:04
Попробуйте для этих целей: decodeURICompon ent и decodeURI. И вот этот вариант:

encode(decodeURI(VAR_FROM_PHP))

где функция encode это:

function encode(sValue) {
var text = "", Ucode, ExitValue, s;
for (var i = 0; i < sValue.length; i++) {
s = sValue.charAt(i );
Ucode = s.charCodeAt(0) ;
var Acode = Ucode;
if (Ucode > 1039 && Ucode < 1104) {
Acode -= 848;
ExitValue = "%" + Acode.toString( 16);
}
else if (Ucode == 1025) {
Acode = 168;
ExitValue = "%" + Acode.toString( 16);
}
else if (Ucode == 1105) {
Acode = 184;
ExitValue = "%" + Acode.toString( 16);
}
else if (Ucode == 32) {
Acode = 32;
ExitValue = "%" + Acode.toString( 16);
}
else if (Ucode == 10){
Acode = 10;
ExitValue = "%0A";
}
else {
ExitValue = s;
}
text = text + ExitValue;
}
return text;
}
Reply | Reply with quote | Quote | Report to administrator

Add comment


Security code
Refresh