[php] json_encode가 빈 문자열을 반환하는 이유

3 개의 중첩 배열이있는 간단한 PHP 구조가 있습니다.

나는 특정 객체를 사용하지 않고 2 개의 중첩 루프가있는 배열을 직접 만듭니다.

다음은 Json으로 변환하려는 배열의 var_dump 샘플입니다.

array (size=2)
  'tram B' =>
    array (size=2)
      0 =>
        array (size=3)
          'name' => string 'Ile Verte' (length=9)
          'distance' => int 298
          'stationID' => int 762
      1 =>
        array (size=3)
          'name' => string 'La Tronche Hôpital' (length=18)
          'distance' => int 425
          'stationID' => int 771
  16 =>
    array (size=4)
      0 =>
        array (size=3)
          'name' => string 'Bastille' (length=8)
          'distance' => int 531
          'stationID' => int 397
      1 =>
        array (size=3)
          'name' => string 'Xavier Jouvin' (length=13)
          'distance' => int 589
          'stationID' => int 438

다른 스크립트에서 나는 비슷한 구조를 가지고 있으며 json_encode잘 작동합니다. 그래서 이유를 이해하지 못합니다json_encode 여기서 작동 .

편집 : 인코딩에 문제가있는 것 같습니다. 때 mb_detect_encoding반환 ASCII의json_encode 작품 만이 UTF8을 반환 할 때, 그것은 더 이상 작동하지 않습니다.

Edit2 : 다음 을 의미하는 json_last_error()반환 JSON_ERROR_UTF8: 잘못된 UTF-8 문자, 잘못 인코딩되었을 수 있습니다 .



답변

파기 2 시간 후 (편집 참조)

다음을 발견했습니다.

  • 제 경우에는 인코딩 문제입니다.
  • mb_detect_encoding 아마도 잘못된 응답을 반환합니다. 일부 문자열은 아마도 UTF-8이 아닐 것입니다.
  • 사용 utf8_encode()하는 문자열에 내 문제를 해결하지만, 아래 참고 참조

다음은 배열에 포함 된 모든 문자열을 UTF-8로 강제 변환 할 수있는 재귀 함수입니다.

function utf8ize($d) {
    if (is_array($d)) {
        foreach ($d as $k => $v) {
            $d[$k] = utf8ize($v);
        }
    } else if (is_string ($d)) {
        return utf8_encode($d);
    }
    return $d;
}

다음과 같이 간단히 사용하십시오.

echo json_encode(utf8ize($data));

참고 : utf8_encode () 는 문서에 따라 ISO-8859-1 문자열을 UTF-8로 인코딩하므로 입력 인코딩이 확실하지 않은 경우 iconv () 또는 mb_convert_encoding () 이 주석 및 기타 솔루션에 명시된대로 더 나은 옵션이 될 수 있습니다.


답변

Matthieu Riegler는 정말 좋은 솔루션을 제시했지만 객체를 처리하기 위해 약간 수정해야했습니다.

function utf8ize($d) {
    if (is_array($d))
        foreach ($d as $k => $v)
            $d[$k] = utf8ize($v);

     else if(is_object($d))
        foreach ($d as $k => $v)
            $d->$k = utf8ize($v);

     else
        return utf8_encode($d);

    return $d;
}

참고 : json_last_error () 는 json_encode () / json_encode () 함수를 디버깅하는 데 도움이 될 수 있습니다.


답변

저에게이 문제에 대한 답은 charset=utf8PDO 연결 설정이었습니다 .

$dbo = new PDO('mysql:host=localhost;dbname=yourdb;charset=utf8', $username, $password);


답변

Adam Bubela는 내 문제를 해결하는 데 도움이 된 정말 좋은 솔루션을 제시했으며 여기에 단순화 된 기능이 있습니다.

function utf8ize($d)
{
    if (is_array($d) || is_object($d))
        foreach ($d as &$v) $v = utf8ize($v);
    else
        return utf8_encode($d);

    return $d;
}


답변

PHP 5.6에서 똑같은 문제가 있습니다. 내가 사용하는 서버 열기 UTF-8로 설정되어 Windows 7의 모든 캐릭터 세트에 + Nginx에 있습니다. 이론적 으로 공식 문서 에 따르면 플래그

JSON_UNESCAPED_UNICODE

이 문제를 해결해야합니다. 불행히도 이것은 내 경우가 아닙니다. 이유는 모르겠습니다. 위의 모든 스 니펫은 내 문제를 해결하지 못하므로 내 구현을 찾았습니다. 누군가를 도울 수 있다고 믿습니다. 적어도 러시아 문자는 테스트를 통과합니다.

function utf8ize($d) {
    if (is_array($d) || is_object($d)) {
        foreach ($d as &$v) $v = utf8ize($v);
    } else {
        $enc   = mb_detect_encoding($d);

        $value = iconv($enc, 'UTF-8', $d);
        return $value;
    }

    return $d;
}


답변

이 대답은 작동합니다. 그러나 MySQL에서 데이터를 얻는 경우 (내가 그랬던 것처럼) 더 쉬운 방법이 있습니다.

데이터베이스를 열면 쿼리하기 전에 다음과 같이 mysqli를 사용하여 문자 집합을 설정할 수 있습니다.

/* change character set to utf8 | Procedural*/
if (!mysqli_set_charset($link, "utf8")) {
    printf("Error loading character set utf8: %s\n", mysqli_error($link));
    exit();
}

또는

/* change character set to utf8 | Object Oriented*/
if (!$mysqli->set_charset("utf8")) {
        printf("Error loading character set utf8: %s\n", $mysqli->error);
        exit();
 }

링크 :
http://php.net/manual/en/mysqli.set-charset.php


답변

이전 버전의 PHP (5.2)를 실행하는 서버에서이 문제가 발생했습니다. JSON_FORCE_OBJECT 플래그를 사용하고 있었는데 5.3까지 지원되지 않는 것 같습니다.

따라서 해당 플래그를 사용하는 경우 버전을 확인하십시오!

해결 방법은 다음과 같이 인코딩하기 전에 객체로 캐스팅하는 것 같습니다.

json_encode((object)$myvar);