2014-05-04 53 views
5

我使用幾乎最新版本的php(5.5.11),這裏是問題所在。當我使用字符串部分的json_encode時,它返回false。在開始時我使用substr,但後來我意識到在處理非英文字符串時這是完全錯誤的。但我用mb_substr即使我仍然看到json_encode回報falsejson_encode在處理多字節子字符串時返回false

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

正如你看到的,

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

回報false,並且

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

返回正確的JSON。

當調查json_last_error時,我看到這是由於Malformed UTF-8 characters, possibly incorrectly encoded。所以問題是,mb_substr給我不正常的字符。

當我看着var_dump($a);我看到它產生string(10) "に搭載�"(我假設每個日文字符是3個字節,並且該問號是格式錯誤的字符)。

那麼我怎麼能從這個字符串中得到一個子字符串,我不會得到一個格式錯誤的字符串?

回答

6

只需通過utf-8編碼作爲mb_substr()的第四個參數,您就可以走了。

$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

如果解決了這個問題,並不意味着它的'mb_internal_encoding'沒有被設置爲 'UTF-8'?不能正確設置內部編碼是一個更好的解決方案? –

相關問題