2014-05-04 12 views
5

Ich benutze fast die neueste Version von PHP (5.5.11) und hier ist das Problem. Wenn ich json_encode des Teils der Zeichenfolge verwende, gibt es false zurück. Am Anfang habe ich substr benutzt, aber dann habe ich gemerkt, dass dies völlig falsch ist, wenn man mit nicht-englischen Strings arbeitet. Aber auch nachdem ich mb_substr verwendet immer noch sehe ich, dass json_encode kehrt false:json_encode gibt false zurück, wenn es um Multibyte-Teilstring geht

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

Wie Sie sehen,

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

kehrt false und

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

kehrt richtig json.

Wenn ich in json_last_error schaue, sehe ich, dass dies wegen Malformed UTF-8 characters, possibly incorrectly encoded ist. Das Problem ist also, dass mb_substr mir fehlerhafte Zeichen gibt.

Wenn ich var_dump($a); sehe, sehe ich, dass es produziert string(10) "に搭載�" (ich nehme an, dass jedes japanische char 3 Bytes ist, und das Fragezeichen ist falsches Zeichen).

Also wie kann ich eine Teilzeichenfolge von der Zeichenfolge auf eine Weise erhalten, dass ich keine fehlerhafte Zeichenfolge erhalten werde?

Antwort

6

Einfach übergeben Sie die utf-8 Codierung als der vierte Parameter der mb_substr() und Sie sind gut zu gehen.

$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

Wenn das Problem dadurch gelöst, es bedeutet nicht, Ihr 'mb_internal_encoding' gesetzt ist nicht auf 'utf-8'? Wäre es nicht sinnvoll, die interne Kodierung als bessere Lösung einzustellen? –