AquilaX
AquilaX

Reputation: 1278

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?

Upvotes: 24

Views: 50525

Answers (8)

Oleksandr P.
Oleksandr P.

Reputation: 370

You can use this options:

json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);

Upvotes: 1

Beau Simensen
Beau Simensen

Reputation: 4578

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.

Upvotes: 2

cesar
cesar

Reputation: 41

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);

Upvotes: 3

chanklor
chanklor

Reputation: 527

$str = json_encode($arr, JSON_UNESCAPED_UNICODE);

The use of this solution worked for me with the Latin and the Cyrillic alphabet, with PHP 5.5

Upvotes: 16

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 ?

Upvotes: 1

Alexander Farber
Alexander Farber

Reputation: 22988

Can't you use JSON_UNESCAPED_UNICODE constant here?

Upvotes: 31

Boris Chervenkov
Boris Chervenkov

Reputation: 650

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)

Upvotes: 10

AquilaX
AquilaX

Reputation: 1278

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!

Upvotes: 2

Related Questions