2009-01-04 40 views
12

Tôi đang cố mã hóa mảng Cyrillic UTF-8 thành chuỗi JSON bằng hàm json_encode của php. Mẫu mã trông như thế này:Ký tự Cyrillic trong json_encode của PHP

<?php 
    $arr = array(
    'едно' => 'първи', 
    'две' => 'втори' 
); 
    $str = json_encode($arr); 
    echo $str; 
?> 

Nó hoạt động tốt nhưng kết quả của kịch bản được biểu diễn dưới dạng:

{"\u0435\u0434\u043d\u043e":"\u043f\u044a\u0440\u0432\u0438","\u0434\u0432\u0435":"\u0432\u0442\u043e\u0440\u0438"} 

mà làm cho 6 ký tự cho mỗi nhân vật Cyrillic. Có cách nào để có được các ký tự ban đầu cho các cặp khóa/giá trị thay vì các cặp mã hóa/giá trị không?

+0

Như bạn echo chuỗi, tôi giả sử này wents vào một HTTP response.Mã hóa nào đáp ứng bằng cách sử dụng? Để mã hóa ký tự hợp lệ, vui lòng xem http://json.org/. – hakre

+0

hi try this $ str = json_encode ($ json, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE); –

Trả lời

2

Có vẻ như PHP được xây dựng trong json_encode chỉ hoạt động với UTF-8 và không có chuông và còi khác để tinh chỉnh cách hoạt động liên quan đến mã hóa.

Tôi tìm thấy A completely fair and balanced comparison of php json libraries trên Google. Nó có thể giúp bạn. Bạn có thể thử một thư viện khác dựa trên các bảng ở đây, nếu có thể. Có thêm các thư viện PHP được liệt kê tại json.org mà bạn có thể thử nghiệm.

2

Nó làm việc với http://pear.php.net/pepr/pepr-proposal-show.php?id=198

Với bypass khó chịu trong JSON.php, hàng 298 ..

$char = pack('C*', $ord_var_c, ord($var{$c + 1})); 
$c += 1; 
//$utf16 = $this->utf82utf16($char); 
//$ascii .= sprintf('\u%04s', bin2hex($utf16)); 
$ascii .= $char; 

Cảm ơn!

+0

Làm cách nào bạn tìm hiểu về cách bỏ qua đó? –

+0

Tự tìm ra nó. Rõ ràng là – AquilaX

10

Tôi thấy điều này trong mã của framework Zend:

http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php

Hãy nhìn vào các chức năng decodeUnicodeString (dòng 474):

/** 
    * Decode Unicode Characters from \u0000 ASCII syntax. 
    * 
    * This algorithm was originally developed for the 
    * Solar Framework by Paul M. Jones 
    * 
    * @link http://solarphp.com/ 
    * @link http://svn.solarphp.com/core/trunk/Solar/Json.php 
    * @param string $value 
    * @return string 
    */ 
    public static function decodeUnicodeString($chrs) 

Đó là tĩnh, và bạn có thể dễ dàng trích xuất - chỉ cần thay thế dòng:

490:   $utf8 .= self::_utf162utf8($utf16); 

với:

490:   $utf8 .= mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); 

Không phải là giải pháp lý tưởng, nhưng công việc cho tôi: o)

11

bạn không thể sử dụng liên tục JSON_UNESCAPED_UNICODE đây?

+0

Điều này được giới thiệu trong php 5.4.0. Có vẻ như nó sẽ hoạt động nhưng vẫn không thể xác nhận. – AquilaX

1

Tôi đã xử lý vấn đề tương tự cho Thổ Nhĩ Kỳ ... thực sự chúng tôi không phải làm bất cứ điều gì trình duyệt tự động chuyển đổi chúng trong các khối mã JS. Vì vậy, cách dễ nhất để giải mã chúng là đưa chúng qua javascript. (Ajax vv ...)

Json encode for with non ascii characters ?

2
$str = json_encode($arr, JSON_UNESCAPED_UNICODE); 

Việc sử dụng các giải pháp này làm việc cho tôi với Latin và bảng chữ cái Cyrillic, với PHP 5,5

0

Đây là một câu hỏi cũ thực sự, nhưng Tôi không nghĩ rằng nó đã được trả lời một cách chính xác.

sử dụng một cái gì đó như thế này:

print json_encode($array, JSON_UNESCAPED_UNICODE); 
+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/15286151) – rahulsm

+0

@rahul_m liên kết ở đây ở đâu? –

+0

Tôi không tìm thấy danh mục có liên quan cho câu trả lời này, vì vậy tôi đã lập bản đồ với danh mục này. – rahulsm

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