2016-07-27 4 views
0

PHP 스크립트로 POST 형식을 통해 JSON으로 데이터를 보내는 자바 스크립트가 있습니다.PHP에서 AJAX POST 호출을 통해 문자열을 디코딩하는 중에 예기치 않은 동작이 발생했습니다.

모든 것이 "평범한"문자로 잘 작동하지만 예를 들어 "à"과 같은 악센트가있는 모음을 사용하면 불일치가 발생합니다. 누군가에게이 문제를 해결하는 방법에 대한 제안이 있는지 물어보고 싶습니다.

은 자바 스크립트입니다 : 사물의 PHP 측면에서

$.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) { 
      ... 
     } 
    }); 

내가 할이 :

$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'])를 사용하는 경우 (또는 json_decoding 전에 php : // 입력에서 전달 된 문자열에 사용하면 "Societ \ xe0 sportiva Bridge"가 대신 사용됩니다.

iconv(), mb_convert_variables() 및 mb_convert_encoding()과 같은 다른 변환 함수를 사용하여 UTF-8을 ISO-8859-1로 변환 한 후 위와 같은 결과를 얻으려고했습니다.

encodeURIComponent() 또는 escape()를 사용하여 문자열 client-side 인코딩도 시도했습니다. PHP는 올바른 문자열 (각각 "Societ % C3 % A0 % 20sportiva % 20Bridge"및 "Societ % E0 % 20sportiva % 20Bridge")을 수신하지만, rawurldecode()로 해독 한 후에도 "Societ \ xc3 \ xa0 sportiva Bridge" 및 "Societ \ xe0 sportiva Bridge"와 같습니다.

두 파일 모두 CentOS 시스템에 있으며 UNIX 모드에서는 EOL 변환과 UTF-8 (편집기는 notepad ++)으로 설정된 Charset Encoding으로 저장됩니다.

+0

'contentType :'application/json을 시도하십시오. charset = utf-8''! UTF-8은 모든 악센트를 처리해야합니다. –

+0

@IsmailRBOUH 그냥 여전히 – Night861

+0

당신이 전화해도 동일한 결과를 얻고, 변화를 시도하지'을 console.log (JSON.stringify ({ "조치"params.action, "사용자 이름"params.username, "페이지" : params.page, }))'백엔드 또는 프론트 엔드에 문제가 있는지 확인 하시겠습니까? – RaV

답변

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); 

내가이 당신을 도움이되기를 바랍니다.

+0

안녕하세요. 나는 당신이 제안한대로 해왔고 여전히 "Societ \ xc3 \ xa0 sportiva Bridge"를 얻는다. 문제가 서버 측 설정과 관련이 있는지 궁금해지기 시작했습니다. – Night861

+0

나쁘다! 대답에서 디코딩 된 문자열을'$ content'에 할당하는 것을 잊었습니다. 답에서 두 가지 해결책을 모두 시도해보십시오. 문제 해결에 도움이되기를 바랍니다. –

관련 문제