简体   繁体   中英

Cyrillic characters in PHP's json_encode

I'm trying to encode Cyrillic UTF-8 array to JSON string using php's function json_encode. The sample code looks like this:

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

It works fine but the result of the script is represented as:

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

which makes 6 characters for each Cyrillic character. Is there a way to get the original characters for key/value pairs instead of encoded ones?

你不能在这里使用JSON_UNESCAPED_UNICODE常量吗?

I found this in the code of Zend framework:

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

Take a look at the function decodeUnicodeString ( line 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)

It's static, and you can easily extract it - just replace the line:

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

with:

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

Not an ideal solution, but did the job for me :o)

$str = json_encode($arr, JSON_UNESCAPED_UNICODE);

这个解决方案的使用对我来说适用于拉丁字母和西里尔字母,以及 PHP 5.5

This is a realy old question, but I don't think it was answered correctly.

use something like this:

print json_encode($array, JSON_UNESCAPED_UNICODE);

It looks like PHP's built in json_encode only works with UTF-8 , and no other bells and whistles for tweaking how it works with respect to encoding.

I found A completely fair and balanced comparison of php json libraries on Google. It might help you. You might try another library based on the tables here, if possible. There are additional PHP libraries listed at json.org that you can experiment with.

It worked with http://pear.php.net/pepr/pepr-proposal-show.php?id=198

With nasty bypass in JSON.php, rows 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;

Thanks!

I was dealing the same problem for Turkish ... indeed we don't have to do anything browsers automatically converts them in JS code blocks. So the easiest way of getting them decoded is getting them through javascript. (Ajax etc...)

Json encode for with non ascii characters ?

您可以使用以下选项:

json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM