2009-01-04 48 views
12

我想使用php的函數json_encode將西里爾文UTF-8數組編碼爲JSON字符串。示例代碼如下所示:PHP中的西里爾字符json_encode

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

它工作正常,但腳本的結果表示爲:

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

這使得6個字符爲每個西里爾字符。有沒有辦法獲得鍵/值對的原始字符而不是編碼的字符?

+0

正如你呼應串,我想這wents成HTTP響應。該響應使用哪種編碼?有效的字符編碼請參見http://json.org/。 – hakre 2012-06-02 18:11:50

+0

嗨試試這個$ str = json_encode($ json,JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE); – 2015-07-12 11:26:50

回答

2

它看起來像在json_encode內建的PHP只適用於UTF-8,並沒有其他的花裏胡哨的工作來調整它的編碼方式。

我在Google上找到了A completely fair and balanced comparison of php json libraries。它可能會幫助你。如果可能的話,你可以在這裏嘗試另一個基於表格的庫。在json.org上列出了其他PHP庫,您可以嘗試。

2

它曾與http://pear.php.net/pepr/pepr-proposal-show.php?id=198

隨着討厭的旁路JSON.php,行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; 

謝謝!

+0

您是如何發現繞行的? – 2011-05-16 00:58:48

+0

由我自己決定。這是明顯的 – AquilaX 2011-06-02 09:32:44

10

我發現這個Zend框架的代碼:

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

看看功能decodeUnicodeString(線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) 

它是靜態的,你可以很容易地提取它 - 只需更換線路:

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

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

不是一個理想的解決方案,但爲我做的工作:O)

1

我在處理土耳其語的同樣的問題......的確,我們不必做任何事情,瀏覽器都會自動將它們轉換成JS代碼塊。所以讓他們解碼的最簡單的方法是讓他們通過javascript。 (阿賈克斯等)

Json encode for with non ascii characters ?

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

使用該解決方案的工作對我來說與拉丁和西裏爾字母,用PHP 5.5

0

這是真的老問題,但我認爲它沒有被正確回答。

使用這樣的事情:

print json_encode($array, JSON_UNESCAPED_UNICODE);