2013-06-03 3 views
5

나는 이런 식으로 뭔가 보이는 내 PHP 웹 서비스에 JSON POST 본문 보내고있다 :PHP 유니 코드 JSON에

: 나는 PHP에서 몸을 에코

{ 
    "foo": "☺" 
} 

을,이 참조

{ 
    "foo":"\xe2\x98\xba" 
} 
나는 또한 \uXXXX 해당 전송 시도했습니다

: 원시 JSON 문자열을받을 수 있다는 점에서,

{ 
    "foo": "\u263a" 
} 

이 더 얻었다을 d는 "foo":"\\u263a" 이었지만 json_decode 이후의 값은 \xe2\x98\xba이되었습니다.

JSON 응답에서 값을 사용할 때 문제가 발생합니다. 내가 얻을 : 간단한에서

json_encode(): Invalid UTF-8 sequence in argument 

, 이것은 내가 JSON하려고하는 이유 문자열을 인코딩 할 일이 무엇인가 :

> php -r 'echo json_encode("\x98\xba\xe2");' 
PHP Warning: json_encode(): Invalid UTF-8 sequence in argument in Command line code on line 1 

내 질문이이다 : 나는 최고의 하나에서이 웃는 얼굴을 얻을 수있는 방법 내 응용 프로그램의 끝을 다른 응용 프로그램으로?

제공되는 도움에 감사드립니다.

+1

어떻게 "[...] 몸을 에코 [...] 했습니까? – PleaseStand

+1

'echo "\ xe2 \ x98 \ xba";'작동; 올바른 유니 코드 smilie 보여줍니다. –

+0

@PleaseStand 나는 error_log (file_get_contents ('php : // input'))'와 함께 error_log에 보냈다. –

답변

2

이것이 json_encode의 올바른 동작이라고 생각합니다. 다음 사용하는 경우 :

<script> 
    alert(
    <?php 
     $a = "☺"; 
     echo json_encode($a); 
    ?> 
    ); 
</script> 

HTML 출력은 alert("\u263a");되며 경고는 "\u263a" 이후 자바 스크립트에서 문자열의 정확한 표현이 표시됩니다.

PHP에서 json_encode의 두 번째 매개 변수로 상수를 사용하는 것도 옵션이지만 PHP 5.4.0 이상에서만 사용할 수 있습니다.

어떤 시나리오에서 값을 사용 하시겠습니까?


편집 :

PHP -r '에코로 json_encode ("\ x98 \ XBA \ XE2");'

PHP 경고 :로 json_encode는() :

문제 1 행에 명령 줄 코드의 인수에 잘못된 UTF-8 시퀀스는 문자의 잘못된 순서를 사용합니다. 그것은 당신이를 확인 인코딩 전에 있도록에만 UTF-8 인코딩 작동

echo json_encode("\xe2\x98\xba"); // this works for me 

대신

echo json_encode("\x98\xba\xe2"); 
+0

당신이 여기 뭔가있는 것 같아요. 이 값은 JSON으로 반환해야하며 그 부분에서 문제가 발생합니다. –

+0

@rossmcf 그래서 PHP에서 JSON 응답으로 그 문자가 포함 된 문자열을 보내시겠습니까? 그리고 그 곤경은 무엇입니까? JSON 응답이 JavaScript로 처리되면 결과가'☺' 대신'\ u263a '인 경우에도 올바르게 동작해야합니다. – Mifeet

+0

문제는 json_encode가 적어도 내 버전의 PHP에서는'\ x98 \ xba \ xe2 '을 인코딩하지 않는다는 것입니다. –

1

당신이 json_encode({ foo": "☺"}, JSON_UNESCAPED_UNICODE)

기본적으로로 json_encode 기능을 사용 할 인코딩 할 때 생각해야한다 이런 식으로 문자열을 인코딩합니다.그 다음 false를 반환하는 경우

mb_check_encoding("your string", 'UTF-8') ; 

당신은 UTF-8을 사용하여 변환 할 수 있습니다

utf8_encode("your string"); 
+0

감사합니다. Arun. 당신의 제안을 시도했을 때, json_encode는 "\ u0098 \ u00ba \ u00e2"를 출력했습니다.이 세 문자는 모두 다른 문자들입니다. –

2

PHP의 json_decode() 기능은 제대로 문자를 표시 UTF-8 바이트의 순서 (E2 98 BA를) 반환, 귀하의 의견 케이스를 제공 다르게 동작 .

그러나 Apache HTTPD는 오류 로그에 행을 쓰기 전에 \x 이스케이프 (기능이 ap_escape_logitem())를 적용합니다 (테스트 목적으로 error_log()을 사용했을 때와 동일). 파일 server/gen_test_char.c에 나와 있듯이 "상위 비트 세트를 가진 모든 [...] 8 비트 문자"가 이스케이프됩니다.

+0

아하! 고마워. –