2013-05-11 13 views
79

Tôi có một tập lệnh PHP đề cập đến nhiều ngôn ngữ khác nhau. Thật không may, bất cứ khi nào tôi cố gắng sử dụng json_encode, mọi đầu ra Unicode được chuyển đổi thành các thực thể thập lục phân. Đây có phải là hành vi dự kiến? Có cách nào để chuyển đổi đầu ra thành các ký tự UTF-8 không?Tại sao hàm json_encode của PHP chuyển đổi chuỗi UTF-8 thành các thực thể thập lục phân?

Dưới đây là một ví dụ về những gì tôi đang nhìn thấy:

ĐẦU VÀO

echo $text; 

OUTPUT

База данни грешка. 

ĐẦU VÀO

json_encode($text); 

OUTPUT

"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u0438 \u0433\u0440\u0435\u0448\u043a\u0430." 

Trả lời

180

Kể từ PHP/5.4.0, có một tùy chọn được gọi là "JSON_UNESCAPED_UNICODE". Check it out:

http://se2.php.net/json_encode

Vì vậy, bạn nên thử:

json_encode($text, JSON_UNESCAPED_UNICODE); 
+2

Aha. Cảm ơn! Tôi nên đọc tài liệu kỹ càng hơn. Cảm ơn. –

+2

Tôi tự hỏi nếu có cách nào để đặt cài đặt này làm mặc định. –

+3

JSON_UNESCAPED_UNICODE đã được giới thiệu trong PHP 5.4.0 và không khả dụng trong các phiên bản trước đó. Khi sử dụng nó trong các phiên bản trước, bạn sẽ nhận được lỗi này: "Cảnh báo: json_encode() hy vọng tham số 2 là dài, chuỗi được đưa ra trong ...". Xem câu trả lời của CertaiN bên dưới để biết giải pháp 5.3. –

47

JSON_UNESCAPED_UNICODE có sẵn trên PHP Version 5.4 hoặc sau đó.
Mã sau đây dành cho Phiên bản 5.3.

CẬP NHẬT

  • html_entity_decode là một chút hiệu quả hơn pack + mb_convert_encoding.
  • (*SKIP)(*FAIL) bỏ qua các dấu gạch chéo ngược chính nó và các ký tự được chỉ định bởi JSON_HEX_* cờ.

 

function raw_json_encode($input, $flags = 0) { 
    $fails = implode('|', array_filter(array(
     '\\\\', 
     $flags & JSON_HEX_TAG ? 'u003[CE]' : '', 
     $flags & JSON_HEX_AMP ? 'u0026' : '', 
     $flags & JSON_HEX_APOS ? 'u0027' : '', 
     $flags & JSON_HEX_QUOT ? 'u0022' : '', 
    ))); 
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/"; 
    $callback = function ($m) { 
     return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8'); 
    }; 
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags)); 
} 
+1

Không nên là \ u, tức là chữ hoa? – malhal

+3

Giải pháp tuyệt vời cho PHP <5.4;) – qdev

+0

Tôi đã tìm kiếm 3 ngày để tìm giải pháp này cho Phiên bản 5.3 vì máy chủ của tôi không nâng cấp lên 5.4. Đối với tôi, bạn là một người tiết kiệm cuộc sống và vì đã hoàn thành, tôi thà đánh dấu đây là câu trả lời được chấp nhận! – Laci

-4

Is this the expected behavior?

các json_encode() chỉ làm việc với dữ liệu UTF-8 mã hóa.

có lẽ bạn có thể nhận được một câu trả lời để chuyển đổi nó ở đây: cyrillic-characters-in-phps-json-encode

-1

Vì bạn hỏi:

Is there any way to convert the output to UTF-8 characters?

Một giải pháp khác là sử dụng utf8_encode.

Điều này sẽ mã hóa chuỗi của bạn thành UTF-8.

ví dụ:

foreach ($rows as $key => $row) { 
    $rows[$key]["keyword"] = utf8_encode($row["keyword"]); 
} 

echo json_encode($rows); 
+0

Không sử dụng tính năng này. Như đã nêu trong trang tài liệu PHP, utf8_encode chỉ thích hợp nếu chuỗi ban đầu của bạn là mã hóa ISO-8859-1 (Latin1). Nó không phải là một mục đích tất cả "đảm bảo chuỗi này là utf-8 mã hóa" chức năng. – telomere