2014-05-04 44 views
5

Tôi đang sử dụng hầu hết phiên bản php mới nhất (5.5.11) và đây là vấn đề. Khi tôi sử dụng json_encode của một phần của chuỗi, nó trả về false. Ban đầu tôi đã sử dụng substr, nhưng sau đó tôi nhận ra rằng điều này là hoàn toàn sai khi đối phó với các chuỗi không phải tiếng Anh. Nhưng ngay cả sau khi tôi sử dụng mb_substr tôi vẫn thấy rằng json_encode lợi nhuận false:json_encode trả về false khi xử lý chuỗi con multibyte

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

Như bạn thấy,

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

lợi nhuận false, và

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

lợi nhuận đúng json.

Khi xem xét json_last_error, tôi thấy rằng điều này là do Malformed UTF-8 characters, possibly incorrectly encoded. Vì vậy, vấn đề là mb_substr mang lại cho tôi các ký tự không đúng định dạng.

Khi tôi xem var_dump($a); Tôi thấy rằng nó tạo ra string(10) "に搭載�" (Tôi giả định rằng mỗi char tiếng Nhật là 3 byte và dấu chấm hỏi đó không đúng định dạng char).

Vậy làm cách nào để nhận chuỗi con từ chuỗi theo cách như vậy, tôi sẽ không nhận được chuỗi không đúng định dạng?

Trả lời

6

Chỉ cần chuyển mã hóa utf-8 làm thông số thứ tư của mb_substr() và bạn có thể sử dụng.

$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

Nếu mà giải quyết vấn đề, không phải là nó hàm ý của bạn 'mb_internal_encoding' không được thiết lập để 'utf-8'? Sẽ không chính xác thiết lập mã hóa nội bộ là một giải pháp tốt hơn? –

Các vấn đề liên quan