UTF-8 문자 인코딩이 json_encode()와 경쟁합니다.
퀘스트
악센트 문자가 있는 행을 가져오려고 합니다.컬럼 부호화(NAME)는latin1_swedish_ci.
코드
다음 쿼리는 반환됩니다.Abord â PlouffephpMyAdmin 사용:
SELECT C.NAME FROM CITY C
WHERE C.REGION_ID=10 AND C.NAME_LOWERCASE LIKE '%abor%'
ORDER BY C.NAME LIMIT 30
다음은 기대치를 표시합니다(함수는 호출됩니다).db_fetch_all( $result )):
while( $row = mysql_fetch_assoc( $result ) ) {
foreach( $row as $value ) {
echo $value . " ";
$value = utf8_encode( $value );
echo $value . " ";
}
$r[] = $row;
}
표시되는 값은 다음과 같습니다.5482 5482 Abord â Plouffe Abord â Plouffe
다음으로 어레이는 다음과 같이 부호화됩니다.json_encode:
$rows = db_fetch_all( $result );
echo json_encode( $rows );
문제
웹 브라우저는 다음 값을 받습니다.
{"ID":"5482","NAME":null}
대신:
{"ID":"5482","NAME":"Abord â Plouffe"}
(또는 부호화된 동등한 것).
질문.
문서에는 다음과 같이 기술되어 있습니다.json_encode()UTF-8에서 동작합니다.LATIN1에서 UTF-8로 인코딩된 값을 알 수 있습니다.콜 후에, 에의 콜 후에,json_encode()단, 값은null.
만드는 방법json_encode()UTF-8 값을 올바르게 인코딩할 수 있습니까?
가능한 해결책 중 하나는 Zend Framework를 사용하는 것이지만 피할 수 있다면 사용하지 않는 것이 좋습니다.
// Create an empty array for the encoded resultset
$rows = array();
// Loop over the db resultset and put encoded values into $rows
while($row = mysql_fetch_assoc($result)) {
$rows[] = array_map('utf8_encode', $row);
}
// Output $rows
echo json_encode($rows);
foreach( $row as $value ) {
$value = utf8_encode( $value );
인코딩된 값을 실제로 다시 입력하려는 것이 아닙니다.$row여기서 어레이는 로컬 변수만 변경할 수 있습니다.$value변수를 변경할 때 다시 쓰려면 변수를 참조로 취급해야 합니다.
foreach( $row as &$value ) {
개인적으로는 가능한 한 레퍼런스를 피하고, 그 대신에 이 케이스에 대해 사용하고 싶다.array_mapKemo가 게시한 대로.
또는mysql_set_charsetUTF-8로 이행하기 위한 첫 번째 단계로 실제 테이블 조합에 관계없이 UTF-8로 반환값을 얻을 수 있습니다.
내 해결책은 이 줄을 삽입하는 것이다.mysql_query('SET CHARACTER SET utf8');, 그 전에SELECT이 방법은 좋다.
질의에 넣는 것이 아니라 다음과 같이 입력해야 할 것 같습니다.
mysql_set_charset('utf8');
mysql connect 문 뒤에 표시됩니다.
접속 시:mysql_set_charset('utf8', $link);
예:
<?php
$link = mysql_connect('localhost', 'your_user', 'your_password');
mysql_set_charset('utf8', $link);
$db_selected = mysql_select_db('your_db', $link);
...
도움이 됐으면 좋겠네요.
해라iconv_r($row,"LATIN1","UTF-8//TRANSLIT");(아래의 기능)json_encode()결과를 확인합니다.
테이블 인코딩이나 결과 세트 인코딩으로 UTF-8을 사용하고 있습니다만, UTF-8 이외의 문자를 폼으로 송신하는 경우가 있어, 모든 입력 소스를 추적하는 것이 귀찮기 때문에, 저도 랩을 했습니다.json_encode()더 안전하게 하려고요특히 나는 영국 사람들이 매우 좋아하는 학위 기호와 "똑똑한 인용문"을 포함한 늘 문자열을 가지고 있었다.
function safe_json_encode($mixed,$missing="TRANSLIT"){
$out=json_encode($mixed);
if ($err= json_last_error()){
iconv_r("UTF-8","UTF-8//$missing",$mixed);
$out=json_encode($mixed);
}
return $out;
}
function iconv_r($charset_i, $charset_o, &$mixed) {
if (is_string($mixed)) {
$mixed = iconv($charset_i, $charset_o, $mixed);
} else {
if (is_object($mixed)){
$mixed = (array) $mixed;
}
if (is_array($mixed)){
foreach ($mixed as $key => &$value) {
iconv_r($charset_i, $charset_o, $value);
}
}
}
}
언급URL : https://stackoverflow.com/questions/2790027/utf-8-character-encoding-battles-json-encode
'programing' 카테고리의 다른 글
| 스프링 데이터: "삭제 기준"이 지원됩니까? (0) | 2023.03.17 |
|---|---|
| 오류: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443 (0) | 2023.03.17 |
| Woocommerce:카테고리에서 제품을 추가한 후 카트로 자동 리디렉션 (0) | 2023.03.17 |
| 텍스트 상자에 표시하기 위해 JSON을 아름답게 하려면 어떻게 해야 합니까? (0) | 2023.03.17 |
| Mongoose의 '_v' 필드는 무엇입니까? (0) | 2023.03.17 |