Ablauf
Ablauf

Reputation: 33

Trouble with decode JSON + PHP

My php script gives out this string (for example) for JSON:

{"time":"0:38:01","kto":"\u00d3\u00e1\u00e8\u00e2\u00f6\u00e0 \u00c3\u00e5\u00ed\u00e5\u00f0\u00e0\u00eb\u00ee\u00e2","mess":"\u00c5\u00e4\u00e8\u00ed\u00fb\u00e9: *mm"}

jQuery code gets this string through JSON:

$.getJSON('chat_ajax.php?q=1',
    function(result) {
    alert('Time ' + result.time + ' Kto' + result.kto + ' Mess' + result.mess);
    });

Browser show:

0:38:01 Óáèâöà Ãåíåðàëîâ
Åäèíûé: *mm

How can I decode this string to cyrillic?

Try use:

<META http-equiv="content-type" content="text/html; charset=windows-1251">

but nothing change

PHP Code:

 $res1=mysqli_query($dbc, "SELECT * FROM chat ORDER BY id DESC LIMIT 1");
   while ($row1=mysqli_fetch_array($res1)) {
       $rawArray=array('time' => @date("G:i:s", ($row1['time'] + $plus)), 'kto' => $row1[kto], 'mess' => $row1[mess]);
       $encodedArray = array_map(utf8_encode, $rawArray); 
       echo json_encode($encodedArray); 

PHP ver 5.3.19

Upvotes: 3

Views: 3373

Answers (2)

BigBud52
BigBud52

Reputation: 13

I had similar problem when storing json datas in MySQL BDD : this solved the problem :

json_encode($json_data, JSON_UNESCAPED_UNICODE) ;

Upvotes: 1

Fabian Schmengler
Fabian Schmengler

Reputation: 24551

\uXXXX stands for unicode characters and in unicode 00d3 is Ó and so on. Unicode characters are unambigouos, so the character encoding of the page is ignored for them. You could use the correct unicode (i.e. \u0443 for У) or write your script so that it outputs the real characters in Windows-1251 instead of unicode sequences.

Update

I see from your comment that you fetch this data from MySQL and use json_encode() to output it. json_encode only works for UTF-8 encoded data (and d3 is Ó in UTF-8 as well, this is why you get the wrong unicode sequences).

So, you will have to convert all data from Windows-1251 to UTF-8 before passing it to json_encode, then everything else will work fine.

Converting:

$utf8Array = array_map(function($in) {
    return iconv('Windows-1251', 'UTF-8', $in);
}, $rawArray);

utf8_encode will not work because it is only useful for input in ISO-8859-1 encoding.

Upvotes: 2

Related Questions