title: Using javascript to unserialize
body: <p>I am trying to unserialize the following string:</p>
  
  <blockquote>
    <p>a:1:{i:0;a:9:{s:12:"model_number";s:8:"TTN037-7";s:5:"price";s:4:"2935";s:10:"unit_price";d:2405.32000000000016370904631912708282470703125;s:8:"id_price";d:2935;s:9:"sales_tax";d:223.68000000000000682121026329696178436279296875;s:5:"sales";d:2380.32000000000016370904631912708282470703125;s:7:"service";s:2:"25";s:7:"freight";s:3:"306";s:13:"comm_category";s:3:"X24";}}</p>
  </blockquote>
  
  <p>Using the following js code:</p>
  
  <pre><code>function unserialize(data) {
      // http://kevin.vanzonneveld.net
      // +     original by: Arpad Ray (mailto:arpad@php.net)
      // +     improved by: Pedro Tainha (http://www.pedrotainha.com)
      // +     bugfixed by: dptr1988
      // +      revised by: d3x
      // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
      // +        input by: Brett Zamir (http://brett-zamir.me)
      // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
      // +     improved by: Chris
      // +     improved by: James
      // +        input by: Martin (http://www.erlenwiese.de/)
      // +     bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
      // +     improved by: Le Torbi
      // +     input by: kilops
      // +     bugfixed by: Brett Zamir (http://brett-zamir.me)
      // +      input by: Jaroslaw Czarniak
      // %            note: We feel the main purpose of this function should be to ease the transport of data between php &amp; js
      // %            note: Aiming for PHP-compatibility, we have to translate objects to arrays
      // *       example 1: unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
      // *       returns 1: ['Kevin', 'van', 'Zonneveld']
      // *       example 2: unserialize('a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}');
      // *       returns 2: {firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'}
      var that = this,
      utf8Overhead = function (chr) {
          // http://phpjs.org/functions/unserialize:571#comment_95906
          var code = chr.charCodeAt(0);
          if (code &lt; 0x0080) {
              return 0;
          }
          if (code &lt; 0x0800) {
              return 1;
          }
          return 2;
      },
      error = function (type, msg, filename, line) {
          throw new that.window[type](msg, filename, line);
      },
      read_until = function (data, offset, stopchr) {
          var i = 2, buf = [], chr = data.slice(offset, offset + 1);
  
          while (chr != stopchr) {
              if ((i + offset) &gt; data.length) {
                  error('Error', 'Invalid');
              }
              buf.push(chr);
              chr = data.slice(offset + (i - 1), offset + i);
              i += 1;
          }
          return [buf.length, buf.join('')];
      },
      read_chrs = function (data, offset, length) {
          var i, chr, buf;
  
          buf = [];
          for (i = 0; i &lt; length; i++) {
              chr = data.slice(offset + (i - 1), offset + i);
              buf.push(chr);
              length -= utf8Overhead(chr);
          }
          return [buf.length, buf.join('')];
      },
      _unserialize = function (data, offset) {
          var dtype, dataoffset, keyandchrs, keys,
              readdata, readData, ccount, stringlength,
              i, key, kprops, kchrs, vprops, vchrs, value,
              chrs = 0,
              typeconvert = function (x) {
                  return x;
              };
  
          if (!offset) {
              offset = 0;
          }
          dtype = (data.slice(offset, offset + 1)).toLowerCase();
  
          dataoffset = offset + 2;
  
          switch (dtype) {
              case 'i':
                  typeconvert = function (x) {
                      return parseInt(x, 10);
                  };
                  readData = read_until(data, dataoffset, ';');
                  chrs = readData[0];
                  readdata = readData[1];
                  dataoffset += chrs + 1;
                  break;
              case 'b':
                  typeconvert = function (x) {
                      return parseInt(x, 10) !== 0;
                  };
                  readData = read_until(data, dataoffset, ';');
                  chrs = readData[0];
                  readdata = readData[1];
                  dataoffset += chrs + 1;
                  break;
              case 'd':
                  typeconvert = function (x) {
                      return parseFloat(x);
                  };
                  readData = read_until(data, dataoffset, ';');
                  chrs = readData[0];
                  readdata = readData[1];
                  dataoffset += chrs + 1;
                  break;
              case 'n':
                  readdata = null;
                  break;
              case 's':
                  ccount = read_until(data, dataoffset, ':');
                  chrs = ccount[0];
                  stringlength = ccount[1];
                  dataoffset += chrs + 2;
  
                  readData = read_chrs(data, dataoffset + 1, parseInt(stringlength, 10));
                  chrs = readData[0];
                  readdata = readData[1];
                  dataoffset += chrs + 2;
                  if (chrs != parseInt(stringlength, 10) &amp;&amp; chrs != readdata.length) {
                      error('SyntaxError', 'String length mismatch');
                  }
                  break;
              case 'a':
                  readdata = {};
  
                  keyandchrs = read_until(data, dataoffset, ':');
                  chrs = keyandchrs[0];
                  keys = keyandchrs[1];
                  dataoffset += chrs + 2;
  
                  for (i = 0; i &lt; parseInt(keys, 10); i++) {
                      kprops = _unserialize(data, dataoffset);
                      kchrs = kprops[1];
                      key = kprops[2];
                      dataoffset += kchrs;
  
                      vprops = _unserialize(data, dataoffset);
                      vchrs = vprops[1];
                      value = vprops[2];
                      dataoffset += vchrs;
  
                      readdata[key] = value;
                  }
  
                  dataoffset += 1;
                  break;
              default:
                  error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
                  break;
          }
          return [dtype, dataoffset - offset, typeconvert(readdata)];
      }
  ;
      return _unserialize((data + ''), 0)[2];
  }
  
  function utf8_decode(str_data) {
      // http://kevin.vanzonneveld.net
      // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
      // +      input by: Aman Gupta
      // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
      // +   improved by: Norman "zEh" Fuchs
      // +   bugfixed by: hitwork
      // +   bugfixed by: Onno Marsman
      // +      input by: Brett Zamir (http://brett-zamir.me)
      // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
      // *     example 1: utf8_decode('Kevin van Zonneveld');
      // *     returns 1: 'Kevin van Zonneveld'
      var tmp_arr = [],
      i = 0,
      ac = 0,
      c1 = 0,
      c2 = 0,
      c3 = 0;
  
      str_data += '';
  
      while (i &lt; str_data.length) {
          c1 = str_data.charCodeAt(i);
          if (c1 &lt; 128) {
              tmp_arr[ac++] = String.fromCharCode(c1);
              i++;
          } else if (c1 &gt; 191 &amp;&amp; c1 &lt; 224) {
              c2 = str_data.charCodeAt(i + 1);
              tmp_arr[ac++] = String.fromCharCode(((c1 &amp; 31) &lt;&lt; 6) | (c2 &amp; 63));
              i += 2;
          } else {
              c2 = str_data.charCodeAt(i + 1);
              c3 = str_data.charCodeAt(i + 2);
              tmp_arr[ac++] = String.fromCharCode(((c1 &amp; 15) &lt;&lt; 12) | ((c2 &amp; 63) &lt;&lt; 6) | (c3 &amp; 63));
              i += 3;
          }
      }
  
      return tmp_arr.join('');
  }
  </code></pre>
  
  <p>But i am unable to get any values back when doing this:</p>
  
  <pre><code>function testPHP() {
      var ret;
  
      ret = unserialize('a:1:{i:0;a:9:{s:12:"model_number";s:8:"TTN037-7";s:5:"price";s:4:"2935";s:10:"unit_price";d:2405.32000000000016370904631912708282470703125;s:8:"id_price";d:2935;s:9:"sales_tax";d:223.68000000000000682121026329696178436279296875;s:5:"sales";d:2380.32000000000016370904631912708282470703125;s:7:"service";s:2:"25";s:7:"freight";s:3:"306";s:13:"comm_category";s:3:"X24";}}');
      alert(ret[0]);
      alert(ret[1]);
      alert(ret[2]);
      alert(ret[3]);
  }
  </code></pre>
  
  <p>I have set up a jsfiddle for you all to test > <a href="http://jsfiddle.net/XRrFS/2/" rel="nofollow">http://jsfiddle.net/XRrFS/2/</a></p>
  
  <p>What would i be missing?</p>