UTF-8 karakter kodlaması savaşlar json_encode ()

4 Cevap php

Quest

Ben aksanlı karakterler satırları almak için arıyorum. Sütun için kodlama (NAME) olan latin1_swedish_ci.

The Code

Aşağıdaki sorgu döndürür Abord â Plouffe phpMyAdmin kullanarak:

SELECT C.NAME FROM CITY C
WHERE C.REGION_ID=10 AND C.NAME_LOWERCASE LIKE '%abor%'
ORDER BY C.NAME LIMIT 30

Aşağıdaki görüntüler değerleri (function db_fetch_all( $result )) denir bekleniyor:

  while( $row = mysql_fetch_assoc( $result ) ) {
    foreach( $row as $value ) {
      echo $value . " ";
      $value = utf8_encode( $value );
      echo $value . " ";
    }

    $r[] = $row;
  }

Görüntülenen değerler: 5482 5482 Abord â Plouffe Abord â Plouffe

Daha sonra dizi kullanılarak kodlanmıştır json_encode:

$rows = db_fetch_all( $result );
echo json_encode( $rows );

Problem

Web tarayıcısı aşağıdaki değeri alır:

{"ID":"5482","NAME":null}

Yerine:

{"ID":"5482","NAME":"Abord â Plouffe"}

(Ya da kodlanmış eşdeğer.)

Question

Dokümantasyon json_encode() UTF-8 üzerinde çalıştığını belirtiyor. Ben UTF-8 Latin1 gelen kodlanmış olan değerleri görebilirsiniz. json_encode() için çağrısının ardından, ancak değer olur null.

Nasıl json_encode() düzgün UTF-8 değerleri kodlamak yapabilirim?

Olası bir çözüm Zend Framework kullanmak için, ama ben oldukça bu önlenebilir değil ediyorum eğer.

4 Cevap

while($row = mysql_fetch_assoc($result)) {
  $r[] = array_map('utf8_encode', $row);
}

...

echo json_encode($rows);
foreach( $row as $value ) {
  $value = utf8_encode( $value );

Aslında orada $row diziye kodlanmış değer yazmıyorsunuz, sadece yerel değişken değiştirirken $value. Eğer değişkeni değiştirdiğinizde geri yazmak istiyorsanız, bir referans olarak onu tedavi etmek gerekir:

foreach( $row as &$value ) {

Şahsen ben mümkün başvuruları önlemek denemek istiyorum, ve Kemo tarafından yayınlanmıştır olarak bu durum için yerine array_map kullanın.

Veya mysql_set_charset UTF-8 UTF-8 için uygulama göç yolunda bir ilk adım olarak, ne olursa olsun gerçek tablo alfabe UTF-8 dönüş değerlerini almak için.

Daha çok bir sorguda koyarak daha, bir koymak gerektiğini görünüyor:

mysql_set_charset('utf8');

mysql deyimi bağlandıktan sonra.

Lütfen connect: mysql_set_charset('utf8', $link);

Örnek:

<?php
$link = mysql_connect('localhost', 'your_user', 'your_password');
mysql_set_charset('utf8', $link);
$db_selected = mysql_select_db('your_db', $link);
...

Bu biraz yardımcı olur umarım.