Неожиданное поведение при декодировании строк в PHP (из вызова AJAX POST)

У меня есть javascript, который отправляет данные в JSON через формат POST в PHP-скрипт.

С "обычными" символами все работает нормально, но я вижу несоответствия при использовании, например, гласных с ударениями типа "а". Я хотел бы спросить, есть ли у кого-нибудь предложения о том, как это исправить.

Это Javascript:

$.ajax({
        contentType: 'application/json',
        data: JSON.stringify({
            "action": params.action,
            "username": params.username,
            "page": params.page,
        }),
        processData: false,
        //dataType: 'json',
        url: "/w/ImolaCustom/SudoAutoedit.php",
        type: 'POST',
        success: function(data) { 
            ...
        }
    });

На стороне PHP я делаю это:

$theData = json_decode(file_get_contents('php://input')), true);

Проблема возникает, если я отправлю что-то вроде:

params.page = "Società sportiva Bridge";

поскольку $theData['page'] становится "Societ\xc3\xa0 sportiva Bridge"

Если я использую utf8_decode($theData['page']) (или если я использую его в строке, переданной из php://input до json_decoding, вместо этого я получаю «Societ\xe0 sportiva Bridge».

Я пробовал различные функции преобразования, такие как iconv(), mb_convert_variables() и mb_convert_encoding(), для преобразования из UTF-8 в ISO-8859-1 с теми же результатами, что и выше.

Я также пробовал кодировать строку на стороне клиента с помощью encodeURIComponent() или escape(). PHP получает правильную строку (соответственно "Societ%C3%A0%20sportiva%20Bridge" и "Societ%E0%20sportiva%20Bridge"), но после декодирования с помощью rawurldecode() я все равно получаю "Societ\xc3\xa0 sportiva Bridge" и "Societ\xe0 sportiva Bridge" соответственно.

Оба файла находятся на компьютере с CentOS и сохраняются с преобразованием EOL в режиме UNIX и с кодировкой набора символов, установленной на UTF-8 (редактор — notepad++).


person Night861    schedule 27.07.2016    source источник
comment
Пожалуйста, попробуйте contentType: 'application/json; charset=utf-8' ! UTF-8 должен обрабатывать все акценты.   -  person Ismail RBOUH    schedule 27.07.2016
comment
@IsmailRBOUH Только что попробовал, без изменений, все те же результаты   -  person Night861    schedule 27.07.2016
comment
Можете ли вы позвонить console.log(JSON.stringify({ "action": params.action, "username": params.username, "page": params.page, })), чтобы определить, проблема в серверной или внешней части?   -  person RaV    schedule 27.07.2016
comment
@RaV Эй, я пытался распечатать материал клиента и забыл упомянуть об этом, в любом случае, пожалуйста: {action:toggleFav,username:Admin,page:Società sportiva Bridge}   -  person Night861    schedule 27.07.2016
comment
stackoverflow.com/questions/1805802 / - может попробовать?   -  person RaV    schedule 27.07.2016


Ответы (1)


Пожалуйста, попробуйте это:

$content = file_get_contents('php://input');
$content = mb_convert_encoding($content, 'UTF-8',
          mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));

$theData = json_decode($content, true);

OR:

$content = file_get_contents('php://input');
$content = html_entity_decode(mb_convert_encoding($content, 'HTML-ENTITIES', "UTF-8"));

$theData = json_decode($content, true);

Я надеюсь, что это поможет вам.

person Ismail RBOUH    schedule 27.07.2016
comment
Привет. Я сделал, как вы предложили, и я все еще получаю Societ\xc3\xa0 sportiva Bridge. Я начинаю задаваться вопросом, может ли проблема быть связана с какой-то настройкой на стороне сервера. - person Night861; 27.07.2016
comment
Виноват ! в ответе я забыл присвоить декодированную строку $content. Пожалуйста, попробуйте оба решения в ответе. Я надеюсь, что это поможет вам решить проблему! - person Ismail RBOUH; 27.07.2016