2014-05-04 22 views
5

ile çalışırken yanlış döndürüyor php'nin (5.5.11) en son sürümünü kullanıyorum ve sorun şu. Dizenin parçası json_encode kullandığımda, false değerini döndürür. Başlangıçta substr kullanıyordum, ancak İngilizce olmayan dizelerle uğraşırken bunun tamamen yanlış olduğunu anladım. Ama mb_substr kullanılan sonra bile hala görmek json_encode döndürür false: Gördüğünüz gibijson_encode, multibyte substring

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

,

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

döner false ve

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

döner doğru json.

json_last_error'a baktığımda, bunun Malformed UTF-8 characters, possibly incorrectly encoded nedeniyle olduğunu görüyorum. Yani sorun, mb_substr bana hatalı biçimlendirilmiş karakterler veriyor olmasıdır.

var_dump($a);'a baktığımda, string(10) "に搭載�" (her Japon karakterinin 3 bayt olduğunu ve bu soru işareti hatalı biçimlendirilmiş char olduğunu varsayalım) olduğunu görüyorum.

Dize kaynaklı bir dize bulamayacak şekilde nasıl bir alt dizgi alabilirim?

cevap

6

mb_substr()'un dördüncü parametresi olarak utf-8 kodlamasını iletmeniz yeterlidir ve devam etmekte fayda var. bu sorunu çözmüş Eğer

$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

, bu senin 'mb_internal_encoding' 'utf-8' olarak ayarlanmamış anlamına gelmez? Dahili kodlamayı doğru şekilde ayarlamamak daha iyi bir çözüm olabilir mi? –