Mostrar caracteres con acento y que salen con simbolo ?

Iniciado por Diabliyo, 14 Enero 2011, 18:40 PM

0 Miembros y 3 Visitantes están viendo este tema.

Diabliyo

Buenas.

Tengo problemas para mostrar unos caracteres que tienen acento, me sale impreso un rombo negro con un símbolo de pregunta al centro.

Dichos caracteres acentuados los tome de un archivo de texto que previamente con mi sistema cargue e inserte en mi base de datos, el proceso fue el siguiente:

Código (php) [Seleccionar]
<?php
# script mundo.php
# sube las ciudades a la BDD cuando inicializas el sitio

$file'ciudades.csv';
$buf=''# datos 
$fpfopen($file"r" ); # abrimos stream
$i=0;
$c=0;
$linkconectar();
while(!
feof($fp) )
{
$buffgets($fp2048); # leemos
$xexplode(","$buf);

$existe'select * from MUNDO_CIUDAD where ID=\''$i'\' && CIUDAD=\''proteger_cadena(substr($x[3], 1, -1)). '\'';
if( !mysql_num_rowsmysql_query($existe) ) ) # si no existe, insertamos 
{
$cons1'select * from MUNDO_ESTADO where NUMERO=\''substr$x[2], 1, -1). '\' && ID_PAIS=\''substr$x[1], 1, -1). '\';';
$data1mysql_fetch_array(mysql_query($cons1$link)); # obtenemos datos del Estado de la Ciudad del buffer: $buf
$cons2'insert into MUNDO_CIUDAD( ID, ID_ESTADO, ID_PAIS, CIUDAD ) values( \''$i'\', \''$data1["ID"]. '\', \''$data1["ID_PAIS"]. '\', \''proteger_cadena(substr$x[3], 1, -)). '\' );';
mysql_query$cons2$link );
$c++;
}
$i++;
}
echo 
'Insertadas <b>'$c'</b> ciudades de <b>'$i'</b> recorridos.';
mysql_close($link);
fclose($fp); # cerramos stream 

unset(
$buf);
?>


El archivo ciudades.csv contiene algo como esto:

numero,codigociudad, altitud, latitud, numerociudad, codigoestado, nombreciudad

Existen mas de 100,000 resgistros en ese archivo, asi que con el code que les puse, lo cargue en el sistema y lo inserte.

Por mencionar tambien, yo utilizo una funcion llamada proteger_cadena(), que es mas que esto:

Código (php) [Seleccionar]
<?php
function proteger_cadena$cadena )
{
return htmlentities($cadenaENT_QUOTES);
}
?>


EL PROBLEMA ya es en la practica, cuando dentro de un SELECT despliego los nombres de las ciudades consultadas, me salen con el simbolo que les mencione.... Para ello, cuando se invoca el SELECT mando imprimir con una funcion llamada: desproteger_candea(), implementada asi:

Código (php) [Seleccionar]
<?php
function desproteger_cadena$cadena )
{
$out=$cadena;
$outhtml_entity_decode$outENT_QUOTES );

if( strchr$out"<" ) )
$outstr_replace"<"htmlentities("<"ENT_QUOTES), $out );
if( strchr$out">" ) )
$outstr_replace">"htmlentities(">"ENT_QUOTES), $out );

if( strchr$out"\n" ) )
$outstr_replace"\n""<br>"$out );
if( strchr$out"\t" ) )
$outstr_replace"\t""&nbsp;&nbsp;&nbsp;"$out );

return $out;
}

$consmysql_query();
if( !
mysql_num_rows($cons) )
echo 'No hay ciudades...';
else
{
while($buf=mysql_fetch_array($cons))
{
echo '<select name="variable">
<option value="'
$buf["ID"]. '" />'$buf["NOMBRE"];
</select>';
}
}
?>


Saludos !

Castg!

Pero porq haces un html_entity_decode()? Es en vano decodificarlo y volverlo a codificar y ademas manualmente (uno por uno, caracter por caracter).

Bueno si todavia asi es lo que queres hacer aca tenes una tabla con los codigos que se usan en HTML para determinados caracteres:

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML

Saludos

Diabliyo

Cita de: Castg! en 14 Enero 2011, 19:28 PM
Pero porq haces un html_entity_decode()? Es en vano decodificarlo y volverlo a codificar y ademas manualmente (uno por uno, caracter por caracter).

Bueno si todavia asi es lo que queres hacer aca tenes una tabla con los codigos que se usan en HTML para determinados caracteres:

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML

Saludos

Le paso el html_entity_decode() porque en la BDD los datos se guardan protegidos con htmlentities(), es por eso que se quita, ademas se le pasa htmlentities() a los caracteres que podrian causarme un inyeccion HTML, como: <, >, \n y \t. Todos estos datos se toman en cuenta porque la funcion se aplica para formularios y todo tipo de datos (en formulario intervienen textareas y otros inputs).

Alguien sabe como puedo mostrarlos correctamente ?, se imprime asi: , pero solo dentro del <select>.

Saludos !

WHK

prueba con

<?php header('Content-Type: text/html; charset=ISO-8859-1'); ?>

para poder escribir eñes, acentos etc.

Si vas a cargar un archivo con ciuddes asegurate de que las guardaste con la misma codificación ISO o ANSI y no utf-8 o si no te va a seguir dando error.

Por eso en todos mis scripts les doy en guardar como al principio para elegir la codificación en iso 88591 y luego poner el header en el php. con esto me imprime todos los mismos carácteres que escribo en mi pc sin la necesidad de filtrarlos.

Código (html4strict) [Seleccionar]
<?php header('Content-Type: text/html; charset=ISO-8859-1'); ?>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
  Prueba: áéíóú``´´ñÑ ©® etc etc.<br />
  á : &aacute;
</body>
</html>

~ Yoya ~

Si establece un juego de carácter a la directiva default_charset del php.ini, no es necesario mandar manualmente el juego de carácter en todo los archivos, ya que default_charset lo mandara.

Info

Es recomendable no filtrar los datos que se guardaran en la DB, debes filtrarlo cuando lo vayas a mostrar.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Diabliyo

#5
WHK

Disculpame pero estas en un error, UTF-8 es capaz de imprimir acentos y enies, ya que actualmento uso UTF-8 y no tengro problemas, claro, siempre y cuando esten en el cuerpo y no dentro de un SELECT.

Ademas..., mi apache y mi index.html, los tengo a UTF-8, y pues no quiero cambiarlos porque asi manejo todo mi code, mis funciones, bases, etc, etc....

Existe la manera de dejarlo como UTF-8 y que funcione ?




~Yoya~
Cuando inserto datos en mi BDD, los protejo antes de enviarlos, vaya, les paso la función proteger_cadena() (ya la mencione arriba), y lo hago porque si un usuario escribe algo con un símbolo ' o ", a veces la BDD salta y no inserta, y siendo así, pasando esta función siempre se inserta.

Ya cuando consulto y después voy a imprimir en pantalla algo, utilizo desproteger_cadena(), que en este caso, en el code que puse arriba podrá notas que protegí los caracteres <, >, \n y \t... Pero además también le paso 3 funciones mas que son para convertir caracteres especiales a caritas y traducir el BBCode, pero eso lo borre del code que puse para evitar mostrar mas funciones y despues pregunten "y que hace esa funcion ?, sera la que manda el error..." o cosas asi.




IMPORTANTE

UTF-8 si permite imprimir caracteres con comillas y enies, pero nose porque me esta fallando dentro del SELECT, si es fuera del select, todo va perfecto !

Saludos !

Castg!

NO LE PONGAS EL DECODE!!! Es en vano! Es como que haga:
Código (php) [Seleccionar]
$flota = 1 * 2;
$flota = $flota / 2;


El códio te va a quedar igual.
Además, la funcion "desproteger_cadena()" para que la usas? Proba tu codigo sin modificaciones pero no uses la funcion desproteger cadena. Pensa, si vos estas protegiendo la cadena para evitar xss, para que desprotegerla? Acaso usas "proteger_cadena()" para que no te cierren la comilla de la consulta al MySQL? Si asi es, podes hacer como yo y usar
Código (php) [Seleccionar]
urlencode();
urldecode();


para despejar cualquier caracter que te cause error en las consultas.

Diabliyo

Cita de: Castg! en 15 Enero 2011, 19:15 PM
NO LE PONGAS EL DECODE!!! Es en vano! Es como que haga:
Código (php) [Seleccionar]
$flota = 1 * 2;
$flota = $flota / 2;


El códio te va a quedar igual.
Además, la funcion "desproteger_cadena()" para que la usas? Proba tu codigo sin modificaciones pero no uses la funcion desproteger cadena. Pensa, si vos estas protegiendo la cadena para evitar xss, para que desprotegerla? Acaso usas "proteger_cadena()" para que no te cierren la comilla de la consulta al MySQL? Si asi es, podes hacer como yo y usar
Código (php) [Seleccionar]
urlencode();
urldecode();


para despejar cualquier caracter que te cause error en las consultas.

Amigo te estas avionando demasiado con eso, el punto aqui es que el caracter dentro del SELECT sale en forma de simbolo y no como una letra acentuada.

Sobre la funcion desproteger_cadena() esta YA MENCIONE CLARAMENTE quue elimine 3 funciones que menciono dentro de desproteger_cadenA(), estas son para interpretar el BBCode, caritas y otras cosas, por eso no puedo consultar e imprimir (echo), debo pasar esta funcion que me brinda todo el servicio (BBcode, Caritas, extras y proteccion).

Centremonos en que los acentos dentro del SELECT (unicamente), se imprimen como simbolo :S.

Saludos !

Nakp

ehm... lo ideal es que solo lo guardaras escaped y cuando lo imprimas le pases el htmlentities :P no que lo guardes con htmlentities
Ojo por ojo, y el mundo acabará ciego.

Castg!

si vas a consultar en este foro, proba lo que te decimos.
deja desproteger_cadena() con esas funciones que no pusiste, osea la de html_entity_decode y str_replace() borralas. te lo digo porq si no me equivoco, el html entity decode cambia los: &aacute por á, cosa que si lo sacas, en tu faking select se tendria que ver acentuado. sino, hace un str-replace con lo que yo ya te dije.

PD: me "aviono demasiado" porq el html decode se "apunta" a tu acento

entrada:
Código (php) [Seleccionar]
<pre>
<?php
$var 
"áéíóú";
echo 
$var."\n";
$var htmlentities($var);
echo 
$var."\n";
echo 
html_entity_decode($var);
?>

</pre>


salida:

<pre>
áéíóú
&aacute;&eacute;&iacute;&oacute;&uacute;
áéíóú</pre>



me entedes lo que te digo ahora "amigo"?