programing

UTF-8 문자 인코딩이 json_encode()와 경쟁합니다.

mbctv 2023. 3. 17. 21:55
반응형

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

반응형