Foros del Web » Programando para Internet » PHP »

Problema con encoding

Estas en el tema de Problema con encoding en el foro de PHP en Foros del Web. Hola a Tod@s, Tengo un lío con el encoding (pienso yo). Al hacer una consulta a la base de datos las columnas que contienen el ...
  #1 (permalink)  
Antiguo 26/02/2012, 09:26
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Pregunta Problema con encoding

Hola a Tod@s,

Tengo un lío con el encoding (pienso yo).

Al hacer una consulta a la base de datos las columnas que contienen el caracter Ñ no los retorna, es decir, deja la columna vacía (null).

Si hago SELECT nombre FRON tabla WHERE id='1234' el valor obtenido es null.

Al hacer la consulta por pgAdmin me retorna bien el dato ya que el nombre es PEPITO PIÑERES.

Qué debo hacer para que el query desde PHP lo retorne como debe ser?

Gracias de ante mano por su ayuda

Un Cordial Saludo
  #2 (permalink)  
Antiguo 26/02/2012, 09:52
Avatar de francisco93  
Fecha de Ingreso: julio-2011
Ubicación: Soy ciudadano del mundo, pero vivo en Canarias :)
Mensajes: 58
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: Problema con encoding

Hola augusto_jaramil, espero que este enlace te ayude http://stackoverflow.com/questions/26620/how-to-set-encoding-in-getjson-jquery. Saludos y comenta a ver que tal.
  #3 (permalink)  
Antiguo 26/02/2012, 10:46
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Hola Don francisco93,

Gracias por responder.

Efectivamente utilizo Jquery, pero al incluir el parámetro contentType al parecer no hace el llamado a el programa php.... este es el código de cómo lo estoy haciendo:

Código PHP:
        datos "col="+col+"&posi="+posi+"&ced="+ced+"&nom="+nom+"&accion=consultar";
console.log(datos);
        $.
ajax({
            
type"POST",
            
url"pret_multiple.php",
            
contentType"application/json; charset=ISO-8859-1",
            
//contentType: "application/json; charset=utf-8",
            
dataType"json",
            
datadatos,
            
success: function(json) {
console.log(json);
            }
        }); 
Al hacerlo de esta manera no obtengo ninguna clase de respuesta, es decir, el console.log(json) no se ejecuta.

Al hacerlo quitando el parámetro contentType si obtengo respuesta pero el dato que necesito llega en null

el código php que estoy haciendo es el siguiente

Código PHP:
        case "consultar":
            
extract($_POST);
            if (
strlen(trim($ced)) > 0) {
                   
$sel_comp "maestro.cedula = '$ced'";
            }
            if (
strlen(trim($nom)) > 0) {
                
$nom ereg_replace("\*","%",$nom);
                
$p strpos($nom,"%");
                if (
$p == 0)
                    
$nom .= "%";
                   
$sel_comp "maestro.nombre like '$nom'";
            }
            
$sql "SELECT maestro.cedula, trim(maestro.nombre) as nombre FROM maestro WHERE $sel_comp AND estado = 'A' ORDER BY 2 ";
            
$res lee_todo($sql);
                
$suc true;
                echo 
json_encode(
                    array(
                        
"success" => $suc,
                        
"msg" => $sql,
                        
"data" => $res
                    
)
                );
 die; 
Qué será la vaina?
  #4 (permalink)  
Antiguo 26/02/2012, 12:02
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Hola de nuevo,

Acabo de hacer una vuelta rara:

El resultado del query que estoy haciendo lo envío a una ventana emergente para mostrarlo y ahí sí me está mostrando los datos como deben ser.

Mi idea original es la siguiente:

Si el resultado del query es solo una fila, no veo la necesidad de abrir la ventana emergente y así paso el resultado tal cual como viene a la forma (JQuery). El lío es acá ya que no me retorna el nombre.

Si el resultado del query son varias filas, abro la ventana emergente (SIN JQUERY), muestro el resultado obtenido del query en una forma con checkbox en cada fila para pasar el que se quiere a la ventana papá. Esto me funciona perfecto. Pero acá es donde me quedo como entre loco y bobo tratando de deducir el por qué en la ventana emergente sí muestra bien los datos teniendo en cuenta que con el console.log veo que el nombre lo retorna nulo....

Otro lio que tengo con esto es que si hago la consulta por nombre no retorna naada.... Registro no existe (Grave la vaina, muy grave...)

El encoding de la base de datos es LATIN1


Última edición por augusto_jaramil; 26/02/2012 a las 13:41
  #5 (permalink)  
Antiguo 26/02/2012, 14:19
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Esta es la respuesta del servidor:

Código:
[15:04:40.450]
 ({success:true,
           msg:"SELECT maestro.cedula, trim(maestro.nombre) as nombre FROM maestro WHERE maestro.cedula = '1033704912' AND estado = 'A' ORDER BY 2 ",
          data:[{cedula:"1033704912", nombre:null}]})
 @ http://sistemas.com/informaw/js/ret_multiple.js:143
  #6 (permalink)  
Antiguo 26/02/2012, 16:31
 
Fecha de Ingreso: marzo-2011
Ubicación: Madrid
Mensajes: 6
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Problema con encoding

¿Has mirado la codificación del archivo PHP que hace la consulta a la base de datos?

Yo tengo tengo una base de datos mysql en utf-8 y Apache lo tengo configurado también con codificación en utf-8.

Si el archivo php lo tengo codificado en ANSI me pasa lo mismo que a ti, si hay ñ o acentos me lo pasa a null y otras veces me corta la cadena a partir del caracter ese.
  #7 (permalink)  
Antiguo 26/02/2012, 19:55
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Hola macrvk por responder

La verdad nunca había tenido problemas con esto ya que hasta ahora estoy empezando con este cuento de JQuery

La base de datos la tengo codificada en LATIN1 (PostgreSql)
Haciendo un phpinfo() veo que el charset esta como ISO-8859-1

Lo que he detectado es que los códigos que he hecho sin utilizar JQuery no me ponen problemas en este aspecto y empezar a echar reversa de pa tras (jejejeje... a mal tiempo buena cara) lo veo como complicado...

Como menciono, al abrir una ventana emergente donde no utilizo JQuery no tengo problemas, solo que esos nombre con el caracter Ñ al pasar a el form principal lo convierte a N. Si no abro la ventana emergente me deja el campo vacío.

En fin, todavía ando con el problema a cuestas....:
  #8 (permalink)  
Antiguo 26/02/2012, 20:54
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Como dato adicional:

al enviar la consulta por nombre veo que el odiado caracter lo traduce como \xD1

Así hace la consulta:

Código Javascript:
Ver original
  1. [21:47:11.225] ({success:false,  msg:"Empleado inactivo o no existe Cedula ",
  2.         sql:"SELECT maestro.cedula, trim(maestro.nombre) as nombre FROM maestro WHERE maestro.nombre like 'RODRIGUEZ PE\xD1UELA DANIEL%' AND estado = 'A' ORDER BY 2 ",
  3.          data:[]
  4.         }) @ [url]http://sistemas.com/informaw/js/ret_multiple.js:174[/url]
  #9 (permalink)  
Antiguo 27/02/2012, 08:15
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Hola de nuevo,

Sigo sin resolver este lio...

Cita:
Como menciono, al abrir una ventana emergente donde no utilizo JQuery no tengo problemas, solo que esos nombre con el caracter Ñ al pasar a el form principal lo convierte a N. Si no abro la ventana emergente me deja el campo vacío.
Resulta que en la ventana emergente no ejecuto ningun query. La ventana emergente recibe el resultado obtenido y lo muestra de una vez sin manipular el resultado de alguna manera...

AUXILIOOOOOO!!!!!
  #10 (permalink)  
Antiguo 28/02/2012, 11:54
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Hola de nuevo....

Juepucha, llevo como tres días con este cuento y no lo he podido resolver

Si alguien pudiera realizar una prueba con este código se lo agredecería

Código PHP:
<?
session_start
();

include_once(
"lee_base.php");
include_once(
"configuracion/abrirbd.php");

if (isset(
$_POST["accion"])) {
    
$ced $_POST["ced"];
    
$sql "SELECT trim(nombre) as nombre FROM maestro WHERE cedula='$ced'";
    if (
$res lee_todo($sql)) { //lee_todo funcion que ejecuta el query y regresa el resultado
        
$content = array("data" => $res,
                         
"sql" => $sql
                        
);
    }
    else {
        
$content = array("sql" => $sql,
                         
"msg" => "Error en query"
                        
);
    }
    
armaRespuesta($content);
    die;
}
muestra_forma();
die;

function 
armaRespuesta($content) {
    if ( !
function_exists('json_encode') ){
                   function 
json_encode($content){
                    
//require_once 'Services/JSON.php';
                    
require_once 'JSON.php';
                    
$json = new Services_JSON;
                    return 
$json->encode($content);
                }
    }
    else
        echo 
json_encode($content);
    die;
}

function 
muestra_forma() {
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=LATIN1" />
        <script language="javascript" type="text/javascript" src="js/jquery.js"></script>
        <script>
            $(document).ready( function () {
                $("#ced").change( function () {
                    ced = $("#ced").val();
                    datos = $("#prueba").serialize()+"&accion=envia";
                    $.ajax({
                        data: datos,
                        type: "post",
                        dataType: "json",
                        url: "c.php",
                        success: function(json) {
console.log(json);
                            $.each(json.data, function (clave, valor) {
                                $("#nom").val(valor.nombre);
                            });
                        }
                    });
                });
                return false;
            });
        </script>
    </head>
    <body>
        <form action="<?= $PHP_SELF?>" name="prueba" id="prueba" method="post">
            <input type="text" id="ced" name="ced" value="">
            <input type="text" id="nom" name="nom" value="">
        </form>
    </body>
</html>
<?
?>
El encoding que tiene la base de datos es LATIN1
En la columna nombre hay caracter Ñ y al existir dicho caracter me retorna el campo vacío (null)

Mil Gracias por su ayuda
  #11 (permalink)  
Antiguo 28/02/2012, 18:23
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Ooootra vez yo con mi karma (jejejeje)

A ver, cuando voy a hacer una consulta por nombre (CASTAÑEDA YOLANDA) y verifico el queryString antes de enviarlo veo

Código:
[19:12:51.331] ced=&nom=CASTA%C3%91EDA+YOLANDA&accion=envia
Si envio la peticion al servidor sin type: 'json' y retornar el contenido de $_POST

Código:
			$(document).ready( function () {
				$("input").change( function () {
					datos = $("#prueba").serialize()+"&accion=envia";
console.log(datos);
					$.ajax({
						data: datos,
						type: "post",
						//dataType: "json",
						//contentType: "application/json; charset=iso-8859-1",
						cache: false,
						url: "c.php",
						success: function(json) {
console.log(json);
							$.each(json.data, function (clave, valor) {
								$("#nom").val(valor.nombre);
							});
						}
					});
				});
				return false;
			});
Obtengo

Código:
[19:12:51.476] 
<hr><hr><pre>Array
(
    [ced] => 
    [nom] => CASTAÑEDA YOLANDA
    [accion] => envia
)
</pre>
y el query que hace es

Código:
[19:17:53.421] 
{"sql":"SELECT cedula, nombre FROM maestro WHERE nombre='PINTO CASTA\u00d1EDA MARIA YOLANDA'"}
O sea, veo un revuelto de charset.... (???)
  #12 (permalink)  
Antiguo 29/02/2012, 17:40
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Bueno mis querid@s compañeros,

Después de dar tantas vueltas, cambiar aquí, cambiar allá, quitar aquí, poner allá, leer aquí, leer allá, etc, etc. me veo en la penosa posición de desistir.... ME QUEDO GRANDE ESTA VAINA!!!!!!

Figuró echar reversa de pa'trás y cambiar de JQuery a JavaScript...

Lástima, pero después de todo me sigue gustando bastante JQuery+JSON

A todos aquellos que me brindaron su ayuda les agradezco infinito

Última edición por augusto_jaramil; 01/03/2012 a las 18:09
  #13 (permalink)  
Antiguo 04/03/2012, 13:30
 
Fecha de Ingreso: junio-2004
Ubicación: Ciudad de Panama
Mensajes: 551
Antigüedad: 19 años, 9 meses
Puntos: 8
Respuesta: Problema con encoding

Que tal compañeros foreros,

Yo si decia que esta vaina no podía quedarme grande

Al fin pude resolver mi lio. Comparto la solución. Era BASTAAAAANTE SENCILLA.

En php cuando leo $_POST aplico utf8_decode

Código PHP:
    $ced $_POST["ced"][0];
    
$nom trim($_POST["nom"][0]);
  
$n utf8_decode($nom);
    if (
strlen($ced) >)
        
$sql "SELECT cedula, trim(nombre) as nombre FROM maestro WHERE cedula='$ced' ORDER BY nombre";
    else
        
$sql "SELECT cedula, trim(nombre) as nombre FROM maestro WHERE nombre LIKE '%$n%' ORDER BY nombre";
    
$res lee_todo($sql);
    
$content = array("sql" => $sql,
                     
"data" => $res,
                     
"n" => $n,
                    
"nom" =>$nom
                    
);
    
$output $json->encode($content);
    print(
$output); 
y cuando recibo la respuesta del servidor hago lo siguiente:

Código PHP:
success: function(json) {
    $.
each(json.data, function (clavevalor) {
        $.
each(valor, function (keyvr) {
            if (
key == "cedula")
                $(
"#ced0").val(vr);
            if (
key == "nombre") {
                $(
"#nom0").val(vr);
                
cadena "";
                for (
i=0i<vr.lengthi++) {
                    
letra vr.charAt(i);
                    if (
letra == "\u0441")
                        
letra "ÑA";
                    if (
letra == "\u0445")
                        
letra "ÑE";
                    if (
letra == "\u0449")
                        
letra "ÑI";
                    if (
letra == "\u044F")
                        
letra "ÑO";
                    if (
letra == "\u0455")
                        
letra "ÑU";
                    
cadena cadena+letra;
                }
                $(
"#nom0").val(cadena);
            }
        });
    });

y listo!!!!! a la lata!!!!!

Gracias de nuevo por todo

Etiquetas: encoding, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:42.