2009-01-04 45 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);