Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/06/2015, 06:11
Avatar de Benderzuelo
Benderzuelo
 
Fecha de Ingreso: mayo-2013
Ubicación: España
Mensajes: 223
Antigüedad: 10 años, 10 meses
Puntos: 5
Unespected end of input,(Javascript)

Hola amig@s,

no se si va aquí o en PHP porque tiene que ver con los 2 pero creo que aquí.

Bueno os comento, para cargar un listado en una página uso la función $.post() de Jquery para no recargar, y el php me devuelve un array con el listado y la paginación.
Código Javascript:
Ver original
  1. function listar(){
  2.  $.post(m_url, function(res){
  3.       var resultado = $.parseJSON(res);
  4.       $('#usersList').html(resultado['users']);
  5.       $('#paginacion').html(resultado['paginacion']);
  6.  });
  7. }

Yo se lo devuelvo a la función de Javascript mediante json_encode(array) desde PHP,

funciona, muestra resultados pero a veces sale el error del titulo y casca:

Unespected end of input

Al final después de darle miles de vueltas resulta que si antes de hacer el json_encode, codifico los resultados con utf8_encode no casca pero claro se me ven los caracteres extraños, y con una funcion de javascript simulo un utf8_decode con js.

Código PHP:
Ver original
  1. echo json_encode(array('ok'=>$elementosPorPagina, 'users'=>utf8_encode($us), 'paginacion'=>utf8_encode($paginacion)));

Pongo también la función decode de javascript por si a alguien le sirve, ya que funciona, la encontré por internet

Código Javascript:
Ver original
  1. function utf8_decode(str_data){
  2.     var tmp_arr = [],
  3.     i = 0,
  4.     ac = 0,
  5.     c1 = 0,
  6.     c2 = 0,
  7.     c3 = 0,
  8.     c4 = 0;
  9.    
  10.     str_data += '';
  11.  
  12.     while (i < str_data.length){
  13.         c1 = str_data.charCodeAt(i);
  14.         if (c1 <= 191){
  15.             tmp_arr[ac++] = String.fromCharCode(c1);
  16.             i++;
  17.         }else if(c1 <= 223){
  18.             c2 = str_data.charCodeAt(i + 1);
  19.             tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
  20.             i += 2;
  21.         }else if(c1 <= 239){
  22.         // http://en.wikipedia.org/wiki/UTF-8#Codepage_layout
  23.         c2 = str_data.charCodeAt(i + 1);
  24.         c3 = str_data.charCodeAt(i + 2);
  25.         tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
  26.         i += 3;
  27.         }else{
  28.             c2 = str_data.charCodeAt(i + 1);
  29.             c3 = str_data.charCodeAt(i + 2);
  30.             c4 = str_data.charCodeAt(i + 3);
  31.             c1 = ((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63);
  32.             c1 -= 0x10000;
  33.             tmp_arr[ac++] = String.fromCharCode(0xD800 | ((c1 >> 10) & 0x3FF));
  34.             tmp_arr[ac++] = String.fromCharCode(0xDC00 | (c1 & 0x3FF));
  35.             i += 4;
  36.         }
  37.     }
  38.     return tmp_arr.join('');
  39. }

Hasta aquí todo bien, me funcionaba bien, no se si es una chapuza porque no entiendo mucho de js pero la cuestión es que me funciona, pero hoy en otro proyecto me ha ocurrido lo mismo y al hacer el mismo proceso ahora los acentos los sustituye por un cuadradito pequeño por ejemplo:

Fernᮤez y se come tanto el caracter que lleva el acento como el siguiente y en algunos casos se come 3.

He probado de todo, he probado meterle una cabecera php con la codificación, he probado las metas y todo lo que he visto en otros posts parecidos buscando en el foro.

La cuestión es que me gustaría solucionarlo pero también si alguien me sabe orientar en saber si lo hago bien o si por el contrario resulta que se hace de otra manera, lo agradecería.

Muchas gracias por adelantado