2014-05-04 3 views
5

Sto utilizzando quasi l'ultima versione di php (5.5.11) e qui è il problema. Quando uso json_encode della parte della stringa, restituisce false. All'inizio stavo usando substr, ma poi ho capito che questo è totalmente sbagliato quando si tratta di stringhe non inglesi. Ma anche dopo che ho usato mb_substr vedo ancora che json_encode restituisce false:json_encode restituisce false quando si tratta di sottostringa multibyte

$s = "に搭載されるようになると、その手軽さからJは急速に普及していく。、通信に関する標準を策定する国際団体インターナショナル"; 
$a = mb_substr($s, 0, 10); 

Come si vede,

var_dump(json_encode([ 
    'd' => $a 
])); 

restituisce false, e

var_dump(json_encode([ 
    'd' => $s 
])); 

restituisce corretta JSON.

Quando si esamina json_last_error, vedo che questo è dovuto a Malformed UTF-8 characters, possibly incorrectly encoded. Quindi il problema è che mb_substr mi dà caratteri malformati.

Quando guardo var_dump($a); vedo che produce string(10) "に搭載�" (presumo che ogni carattere giapponese sia 3 byte e che il punto interrogativo sia un carattere non valido).

Quindi, come posso ottenere una sottostringa dalla stringa in modo tale da non ottenere una stringa malformata?

risposta

6

Basta passare la codifica utf-8 come quarto parametro dello mb_substr() e sei a posto.

$a = mb_substr($s, 0, 10,'utf-8'); 
echo $a; // に搭載されるようにな 
echo json_encode($a); // "\u306b\u642d\u8f09\u3055\u308c\u308b\u3088\u3046\u306b\u306a" 

Demonstration

+1

Se che ha risolto il problema, non implica il vostro 'mb_internal_encoding' non è impostato su 'utf-8'? La corretta impostazione della codifica interna non sarebbe una soluzione migliore? –