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=utf8
PDO 연결 설정이었습니다 .
$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();
}
답변
이전 버전의 PHP (5.2)를 실행하는 서버에서이 문제가 발생했습니다. JSON_FORCE_OBJECT 플래그를 사용하고 있었는데 5.3까지 지원되지 않는 것 같습니다.
따라서 해당 플래그를 사용하는 경우 버전을 확인하십시오!
해결 방법은 다음과 같이 인코딩하기 전에 객체로 캐스팅하는 것 같습니다.
json_encode((object)$myvar);