Zend_JSON:Encode messing up - why?

13,516

Solution 1

You fix this by updating your PHP version to a version later than version 5.2.7.

There was a serious UTF-8 bug in PHP's json_encode function before that version. See the changelog for more details.


Since you note that you are using PHP version 5.2.9.2 your version should be good :) Have you tried routing the specific contents of the html through PHP's json_encode() manually?

Or maybe through utf8_encode() or utf8_decode()?

Solution 2

I see only one possible area where NULL may be returned from Encoder.php. I'd begin debugging by doing some var_dumps inside this function in Zend/Json/Encoder.php

protected function _encodeDatum(&$value)
{
    $result = 'null';

    if (is_int($value) || is_float($value)) {
        $result = (string) $value;
        $result = str_replace(",", ".", $result);
    } elseif (is_string($value)) {
        $result = $this->_encodeString($value);
    } elseif (is_bool($value)) {
        $result = $value ? 'true' : 'false';
    }

    return $result;
}

I'm not quite sure why you're HTML string would not be recognized as such, but I might try typecasting it prior to encoding.

array('html' => (string) $yourHtmlStr);

Solution 3

This usually happens if you use substr() or use $somestring[0] on a utf-8 string which has multibyte letters. Use mb_ prefixed functions to edit this sort of data, then you will not have problem with json_encode()

Share:
13,516
Ali
Author by

Ali

I code so I am. Dabble in Php, Javascript, play around with Vue a bit of JQuery - meddle now and then with complex highly unoptimized SQL. Works intensively with Zend Framework, currently dabbling in Ruby on Rails, TDD and undoing bad programming habits. Credentials: Zend Certified Php Programmer(Details Here)

Updated on July 26, 2022

Comments

  • Ali
    Ali almost 2 years

    My Zend_Json is messing up in encoding an object here. I'm encoding an associative array which has two elements: Element one is another associative array while element 2 is an HTML string. He's goofing up such that the Html string part contains just NULL!!?!?!?!?

    Heres the element UNencoded when I do a var_dump on it...sorry for the looong element... Its very erratic - I don't understand whats wrong here...

    array (
      'map' => 
      array (
        0 => 
        array (
          'id' => '1403',
          'name' => 'Amborovy Airport (Philibert Tsiranana Airport)',
          'label' => 'Amborovy Airport (Philibert Tsiranana Airport)',
          'html' => 'Amborovy Airport (Philibert Tsiranana Airport)',
          'lat' => '-0.666944',
          'lng' => '46.3517',
        ),
        1 => 
        array (
          'id' => '6160',
          'name' => 'Generalissimo Francisco de Miranda Airbase',
          'label' => 'Generalissimo Francisco de Miranda Airbase',
          'html' => 'Generalissimo Francisco de Miranda Airbase',
          'lat' => '0.485',
          'lng' => '-66.8436',
        ),
        2 => 
        array (
          'id' => '7808',
          'name' => 'Tirana International Airport',
          'label' => 'Tirana International Airport',
          'html' => 'Tirana International Airport',
          'lat' => '41.4150929722',
          'lng' => '19.7233001667',
        ),
        3 => 
        array (
          'id' => '20881',
          'name' => 'Tiranë Heliport',
          'label' => 'Tiranë Heliport',
          'html' => 'Tiranë Heliport',
          'lat' => 41.315865416667,
          'lng' => 19.888245972222,
        ),
        4 => 
        array (
          'id' => '5218',
          'name' => 'Abadan Airport',
          'label' => 'Abadan Airport',
          'html' => 'Abadan Airport',
          'lat' => '0.371111',
          'lng' => '48.2283',
        ),
        5 => 
        array (
          'id' => '5330',
          'name' => 'Lar Airport',
          'label' => 'Lar Airport',
          'html' => 'Lar Airport',
          'lat' => '0.673056',
          'lng' => '54.3814',
        ),
        6 => 
        array (
          'id' => '7808',
          'name' => 'Tirana International Airport',
          'label' => 'Tirana International Airport',
          'html' => 'Tirana International Airport',
          'lat' => '41.4150929722',
          'lng' => '19.7233001667',
        ),
        7 => 
        array (
          'id' => '20881',
          'name' => 'Tiranë Heliport',
          'label' => 'Tiranë Heliport',
          'html' => 'Tiranë Heliport',
          'lat' => 41.315865416667,
          'lng' => 19.888245972222,
        ),
        8 => 
        array (
          'id' => '5218',
          'name' => 'Abadan Airport',
          'label' => 'Abadan Airport',
          'html' => 'Abadan Airport',
          'lat' => '0.371111',
          'lng' => '48.2283',
        ),
        9 => 
        array (
          'id' => '5225',
          'name' => 'Ahvaz Airport',
          'label' => 'Ahvaz Airport',
          'html' => 'Ahvaz Airport',
          'lat' => '0.337431',
          'lng' => '48.762',
        ),
        10 => 
        array (
          'id' => '5242',
          'name' => 'Ardabil Airport',
          'label' => 'Ardabil Airport',
          'html' => 'Ardabil Airport',
          'lat' => '0.325556',
          'lng' => '48.4242',
        ),
        11 => 
        array (
          'id' => '5243',
          'name' => 'Asalouyeh Airport',
          'label' => 'Asalouyeh Airport',
          'html' => 'Asalouyeh Airport',
          'lat' => '0.481389',
          'lng' => '52.6153',
        ),
        12 => 
        array (
          'id' => '5251',
          'name' => 'Bandar Abbas International Airport',
          'label' => 'Bandar Abbas International Airport',
          'html' => 'Bandar Abbas International Airport',
          'lat' => '0.218056',
          'lng' => '56.3778',
        ),
        13 => 
        array (
          'id' => '5259',
          'name' => 'Birjand Airport',
          'label' => 'Birjand Airport',
          'html' => 'Birjand Airport',
          'lat' => '0.898056',
          'lng' => '59.2661',
        ),
        14 => 
        array (
          'id' => '5278',
          'name' => 'Dezful Airport',
          'label' => 'Dezful Airport',
          'html' => 'Dezful Airport',
          'lat' => '0.434444',
          'lng' => '48.3976',
        ),
        15 => 
        array (
          'id' => '5306',
          'name' => 'Jiroft Airport',
          'label' => 'Jiroft Airport',
          'html' => 'Jiroft Airport',
          'lat' => '0.726944',
          'lng' => '57.6703',
        ),
        16 => 
        array (
          'id' => '5326',
          'name' => 'Konarak Airport',
          'label' => 'Konarak Airport',
          'html' => 'Konarak Airport',
          'lat' => '0.443333',
          'lng' => '60.3819',
        ),
        17 => 
        array (
          'id' => '5330',
          'name' => 'Lar Airport',
          'label' => 'Lar Airport',
          'html' => 'Lar Airport',
          'lat' => '0.673056',
          'lng' => '54.3814',
        ),
        18 => 
        array (
          'id' => '5331',
          'name' => 'Lavan Airport',
          'label' => 'Lavan Airport',
          'html' => 'Lavan Airport',
          'lat' => '0.810278',
          'lng' => '53.3561',
        ),
        19 => 
        array (
          'id' => '5359',
          'name' => 'Parsabad-Moghan Airport',
          'label' => 'Parsabad-Moghan Airport',
          'html' => 'Parsabad-Moghan Airport',
          'lat' => '0.603606',
          'lng' => '47.8815',
        ),
        20 => 
        array (
          'id' => '5361',
          'name' => 'Persian Gulf Airport (Khalije Fars Airport)',
          'label' => 'Persian Gulf Airport (Khalije Fars Airport)',
          'html' => 'Persian Gulf Airport (Khalije Fars Airport)',
          'lat' => '0.379444',
          'lng' => '52.7375',
        ),
        21 => 
        array (
          'id' => '5393',
          'name' => 'Shahid Sadooghi Airport',
          'label' => 'Shahid Sadooghi Airport',
          'html' => 'Shahid Sadooghi Airport',
          'lat' => '0.905',
          'lng' => '54.2764',
        ),
        22 => 
        array (
          'id' => '5411',
          'name' => 'Tabriz International Airport',
          'label' => 'Tabriz International Airport',
          'html' => 'Tabriz International Airport',
          'lat' => '0.133889',
          'lng' => '46.235',
        ),
        23 => 
        array (
          'id' => '1416',
          'name' => 'Arrachart Airport',
          'label' => 'Arrachart Airport',
          'html' => 'Arrachart Airport',
          'lat' => '-0.349167',
          'lng' => '49.2917',
        ),
        24 => 
        array (
          'id' => '7808',
          'name' => 'Tirana International Airport',
          'label' => 'Tirana International Airport',
          'html' => 'Tirana International Airport',
          'lat' => '41.4150929722',
          'lng' => '19.7233001667',
        ),
        25 => 
        array (
          'id' => '20881',
          'name' => 'Tiranë Heliport',
          'label' => 'Tiranë Heliport',
          'html' => 'Tiranë Heliport',
          'lat' => 41.315865416667,
          'lng' => 19.888245972222,
        ),
      ),
      'html' => '<div><b>Search Results for terms \'Iran\'</b>  </div><a class="map-link"  href="javascript:void(0);" onclick="toggleMapsSearch(\'name\');">4 results of Names with "Iran"</a><div id="map-results-name" class="map-results-nubbin" style="display:none;"><a class="map-sub-links" href="javascript:mapClickHandler(\'1403\')">Amborovy Airport (Philibert Ts<span Style="color:red; Font-weight:bold;">Iran</span>ana Airport)</a><a class="map-sub-links" href="javascript:mapClickHandler(\'6160\')">Generalissimo Francisco De M<span Style="color:red; Font-weight:bold;">Iran</span>da Airbase</a><a class="map-sub-links" href="javascript:mapClickHandler(\'7808\')">T<span Style="color:red; Font-weight:bold;">Iran</span>a International Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'20881\')">T<span Style="color:red; Font-weight:bold;">Iran</span>ë Heliport</a></div><a class="map-link" href="javascript:void(0);" onclick="toggleMapsSearch(\'city\');">4 results of Cities with "Iran"</a><div id="map-results-city" class="map-results-nubbin" style="display:none;"><a class="map-sub-links" href="javascript:mapClickHandler(\'5218\')">Abadan, <span Style="color:red; Font-weight:bold;">Iran</span> : Abadan Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5330\')">Lar, <span Style="color:red; Font-weight:bold;">Iran</span> : Lar Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'7808\')">T<span Style="color:red; Font-weight:bold;">Iran</span>a : Tirana International Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'20881\')">T<span Style="color:red; Font-weight:bold;">Iran</span>a : Tiranë Heliport</a></div><a class="map-link" href="javascript:void(0);" onclick="toggleMapsSearch(\'country\');">15 results of Countries with "Iran"</a><div id="map-results-country" class="map-results-nubbin" style="display:none;"><a class="map-sub-links" href="javascript:mapClickHandler(\'5218\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Abadan Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5225\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Ahvaz Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5242\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Ardabil Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5243\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Asalouyeh Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5251\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Bandar Abbas International Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5259\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Birjand Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5278\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Dezful Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5306\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Jiroft Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5326\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Konarak Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5330\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Lar Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5331\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Lavan Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5359\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Parsabad-Moghan Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5361\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Persian Gulf Airport (Khalije Fars Airport)</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5393\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Shahid Sadooghi Airport</a><a class="map-sub-links" href="javascript:mapClickHandler(\'5411\')"><span Style="color:red; Font-weight:bold;">Iran</span> : Tabriz International Airport</a></div>',
    )
    

    And here's what happens when I try to encode it in JSON using Zends_JSON class...

    {"map":[{"id":"1403","name":"Amborovy Airport (Philibert Tsiranana Airport)","label":"Amborovy Airport (Philibert Tsiranana Airport)","html":"Amborovy Airport (Philibert Tsiranana Airport)","lat":"-0.666944","lng":"46.3517"},{"id":"6160","name":"Generalissimo Francisco de Miranda Airbase","label":"Generalissimo Francisco de Miranda Airbase","html":"Generalissimo Francisco de Miranda Airbase","lat":"0.485","lng":"-66.8436"},{"id":"7808","name":"Tirana International Airport","label":"Tirana International Airport","html":"Tirana International Airport","lat":"41.4150929722","lng":"19.7233001667"},{"id":"20881","name":null,"label":null,"html":null,"lat":41.315865416667,"lng":19.888245972222},{"id":"5218","name":"Abadan Airport","label":"Abadan Airport","html":"Abadan Airport","lat":"0.371111","lng":"48.2283"},{"id":"5330","name":"Lar Airport","label":"Lar Airport","html":"Lar Airport","lat":"0.673056","lng":"54.3814"},{"id":"7808","name":"Tirana International Airport","label":"Tirana International Airport","html":"Tirana International Airport","lat":"41.4150929722","lng":"19.7233001667"},{"id":"20881","name":null,"label":null,"html":null,"lat":41.315865416667,"lng":19.888245972222},{"id":"5218","name":"Abadan Airport","label":"Abadan Airport","html":"Abadan Airport","lat":"0.371111","lng":"48.2283"},{"id":"5225","name":"Ahvaz Airport","label":"Ahvaz Airport","html":"Ahvaz Airport","lat":"0.337431","lng":"48.762"},{"id":"5242","name":"Ardabil Airport","label":"Ardabil Airport","html":"Ardabil Airport","lat":"0.325556","lng":"48.4242"},{"id":"5243","name":"Asalouyeh Airport","label":"Asalouyeh Airport","html":"Asalouyeh Airport","lat":"0.481389","lng":"52.6153"},{"id":"5251","name":"Bandar Abbas International Airport","label":"Bandar Abbas International Airport","html":"Bandar Abbas International Airport","lat":"0.218056","lng":"56.3778"},{"id":"5259","name":"Birjand Airport","label":"Birjand Airport","html":"Birjand Airport","lat":"0.898056","lng":"59.2661"},{"id":"5278","name":"Dezful Airport","label":"Dezful Airport","html":"Dezful Airport","lat":"0.434444","lng":"48.3976"},{"id":"5306","name":"Jiroft Airport","label":"Jiroft Airport","html":"Jiroft Airport","lat":"0.726944","lng":"57.6703"},{"id":"5326","name":"Konarak Airport","label":"Konarak Airport","html":"Konarak Airport","lat":"0.443333","lng":"60.3819"},{"id":"5330","name":"Lar Airport","label":"Lar Airport","html":"Lar Airport","lat":"0.673056","lng":"54.3814"},{"id":"5331","name":"Lavan Airport","label":"Lavan Airport","html":"Lavan Airport","lat":"0.810278","lng":"53.3561"},{"id":"5359","name":"Parsabad-Moghan Airport","label":"Parsabad-Moghan Airport","html":"Parsabad-Moghan Airport","lat":"0.603606","lng":"47.8815"},{"id":"5361","name":"Persian Gulf Airport (Khalije Fars Airport)","label":"Persian Gulf Airport (Khalije Fars Airport)","html":"Persian Gulf Airport (Khalije Fars Airport)","lat":"0.379444","lng":"52.7375"},{"id":"5393","name":"Shahid Sadooghi Airport","label":"Shahid Sadooghi Airport","html":"Shahid Sadooghi Airport","lat":"0.905","lng":"54.2764"},{"id":"5411","name":"Tabriz International Airport","label":"Tabriz International Airport","html":"Tabriz International Airport","lat":"0.133889","lng":"46.235"},{"id":"1416","name":"Arrachart Airport","label":"Arrachart Airport","html":"Arrachart Airport","lat":"-0.349167","lng":"49.2917"},{"id":"7808","name":"Tirana International Airport","label":"Tirana International Airport","html":"Tirana International Airport","lat":"41.4150929722","lng":"19.7233001667"},{"id":"20881","name":null,"label":null,"html":null,"lat":41.315865416667,"lng":19.888245972222}],"html":null}
    

    Notice at the end - the humongous clunk of HTML - GONE replaced by a null.... whats happening here :(


    EDIT

    After some investigation I found this error in my error logs:

    PHP Warning:  json_encode() [<a href='function.json-encode'>function.json-encode</a>]: Invalid UTF-8 sequence in argument in C:\wamp\www\fltdata\library\Zend\Json.php
    

    I think it might have something to do with the problem I'm facing? How do I fix this?


    EDIT

    My version of Php is 5.2.9-2 - I doubt this is due to the issue which was in versions earlier than 5.2.7... help here guys please!!!


    EDIT

    Running the object through json_encode() returns the same result and I get the same error:

    PHP Warning:  json_encode() [<a href='function.json-encode'>function.json-encode</a>]: Invalid UTF-8 sequence in argument in...
    

    I'm stumped here :(


    SOLUTION

    WOO HOOO!!!! I figured it out: I just run the html string variable through a utf8_encode function and then run the JSON encode function on it:

    $result['html'] = utf8_encode($result['html']);

    And it works - Thanks everybody for all the help guys - I feel heavily confined by not being able to vote more than once for each of the posts here - you've all been a fanstastic help :D Thanks again!!!