[英]Cyrillic characters in PHP's json_encode
我正在尝试使用 php 的函数 json_encode 将 Cyrillic UTF-8 数组编码为 JSON 字符串。 示例代码如下所示:
<?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 个字符。 有没有办法获取键/值对的原始字符而不是编码的字符?
你不能在这里使用JSON_UNESCAPED_UNICODE常量吗?
我在 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)
$str = json_encode($arr, JSON_UNESCAPED_UNICODE);
这个解决方案的使用对我来说适用于拉丁字母和西里尔字母,以及 PHP 5.5
这是一个非常古老的问题,但我认为没有正确回答。
使用这样的东西:
print json_encode($array, JSON_UNESCAPED_UNICODE);
看起来 PHP 内置的json_encode
只适用于UTF-8
,并且没有其他花哨的东西来调整它在编码方面的工作方式。
我在 Google 上找到了一个完全公平和平衡的 php json 库比较。 它可能会帮助你。 如果可能,您可以根据此处的表格尝试另一个库。 json.org上列出了其他 PHP 库,您可以进行试验。
它适用于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;
谢谢!
我正在为土耳其语处理同样的问题……事实上,我们不必做任何事情,浏览器会自动将它们转换为 JS 代码块。 因此,解码它们的最简单方法是通过 javascript 获取它们。 (阿贾克斯等...)
您可以使用以下选项:
json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.