elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Mostrar caracteres con acento y que salen con simbolo ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Mostrar caracteres con acento y que salen con simbolo ?  (Leído 15,645 veces)
Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Mostrar caracteres con acento y que salen con simbolo ?
« en: 14 Enero 2011, 18:40 pm »

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
  1. <?php
  2. # script mundo.php
  3. # sube las ciudades a la BDD cuando inicializas el sitio
  4.  
  5. $file= 'ciudades.csv';
  6. $buf=''; # datos
  7. $fp= fopen($file, "r" ); # abrimos stream
  8. $i=0;
  9. $c=0;
  10. $link= conectar();
  11. while(!feof($fp) )
  12. {
  13. $buf= fgets($fp, 2048); # leemos
  14. $x= explode(",", $buf);
  15.  
  16. $existe= 'select * from MUNDO_CIUDAD where ID=\''. $i. '\' && CIUDAD=\''. proteger_cadena(substr($x[3], 1, -1)). '\'';
  17. if( !mysql_num_rows( mysql_query($existe) ) ) # si no existe, insertamos
  18. {
  19. $cons1= 'select * from MUNDO_ESTADO where NUMERO=\''. substr( $x[2], 1, -1). '\' && ID_PAIS=\''. substr( $x[1], 1, -1). '\';';
  20. $data1= mysql_fetch_array(mysql_query($cons1, $link)); # obtenemos datos del Estado de la Ciudad del buffer: $buf
  21. $cons2= 'insert into MUNDO_CIUDAD( ID, ID_ESTADO, ID_PAIS, CIUDAD ) values( \''. $i. '\', \''. $data1["ID"]. '\', \''. $data1["ID_PAIS"]. '\', \''. proteger_cadena(substr( $x[3], 1, -1 )). '\' );';
  22. mysql_query( $cons2, $link );
  23. $c++;
  24. }
  25. $i++;
  26. }
  27. echo 'Insertadas <b>'. $c. '</b> ciudades de <b>'. $i. '</b> recorridos.';
  28. mysql_close($link);
  29. fclose($fp); # cerramos stream
  30.  
  31. unset($buf);
  32. ?>

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
  1. <?php
  2. function proteger_cadena( $cadena )
  3. {
  4. return htmlentities($cadena, ENT_QUOTES);
  5. }
  6. ?>

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
  1. <?php
  2. function desproteger_cadena( $cadena )
  3. {
  4. $out=$cadena;
  5. $out= html_entity_decode( $out, ENT_QUOTES );
  6.  
  7. if( strchr( $out, "<" ) )
  8. $out= str_replace( "<", htmlentities("<", ENT_QUOTES), $out );
  9. if( strchr( $out, ">" ) )
  10. $out= str_replace( ">", htmlentities(">", ENT_QUOTES), $out );
  11.  
  12. if( strchr( $out, "\n" ) )
  13. $out= str_replace( "\n", "<br>", $out );
  14. if( strchr( $out, "\t" ) )
  15. $out= str_replace( "\t", "&nbsp;&nbsp;&nbsp;", $out );
  16.  
  17. return $out;
  18. }
  19.  
  20. $cons= mysql_query();
  21. if( !mysql_num_rows($cons) )
  22. echo 'No hay ciudades...';
  23. else
  24. {
  25. while($buf=mysql_fetch_array($cons))
  26. {
  27. echo '<select name="variable">
  28. <option value="'. $buf["ID"]. '" />'. $buf["NOMBRE"];
  29. </select>';
  30. }
  31. }
  32. ?>

Saludos !


« Última modificación: 14 Enero 2011, 18:44 pm por Diabliyo » En línea

Castg!
Wiki

Desconectado Desconectado

Mensajes: 1.191



Ver Perfil WWW
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #1 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


En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #2 en: 14 Enero 2011, 19:43 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 !
En línea

WHK
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.442


The Hacktivism is not a crime


Ver Perfil WWW
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #3 en: 14 Enero 2011, 21:27 pm »

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
  1. <?php header('Content-Type: text/html; charset=ISO-8859-1'); ?>
  2. <head>
  3.  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  4. </head>
  5. <body>
  6.  Prueba: áéíóú``´´ñÑ ©® etc etc.<br />
  7.  á : &aacute;
  8. </body>
  9. </html>
En línea

Telegram: @WHK102 - Semáforo Epidemiologico Chile
~ Yoya ~
Wiki

Desconectado Desconectado

Mensajes: 1.125



Ver Perfil
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #4 en: 14 Enero 2011, 21:38 pm »

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.
En línea

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


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #5 en: 14 Enero 2011, 21:51 pm »

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 !
« Última modificación: 14 Enero 2011, 21:59 pm por Diabliyo » En línea

Castg!
Wiki

Desconectado Desconectado

Mensajes: 1.191



Ver Perfil WWW
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #6 en: 15 Enero 2011, 19:15 pm »

NO LE PONGAS EL DECODE!!! Es en vano! Es como que haga:
Código
  1. $flota = 1 * 2;
  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

para despejar cualquier caracter que te cause error en las consultas.
En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #7 en: 16 Enero 2011, 03:16 am »

NO LE PONGAS EL DECODE!!! Es en vano! Es como que haga:
Código
  1. $flota = 1 * 2;
  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

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 !
En línea

Nakp
casi es
Ex-Staff
*
Desconectado Desconectado

Mensajes: 6.336

he vuelto :)


Ver Perfil WWW
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #8 en: 16 Enero 2011, 05:42 am »

ehm... lo ideal es que solo lo guardaras escaped y cuando lo imprimas le pases el htmlentities :P no que lo guardes con htmlentities
En línea

Ojo por ojo, y el mundo acabará ciego.
Castg!
Wiki

Desconectado Desconectado

Mensajes: 1.191



Ver Perfil WWW
Re: Mostrar caracteres con acento y que salen con simbolo ?
« Respuesta #9 en: 16 Enero 2011, 21:06 pm »

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
  1. <pre>
  2. <?php
  3. $var = "áéíóú";
  4. echo $var."\n";
  5. $var = htmlentities($var);
  6. echo $var."\n";
  7. echo html_entity_decode($var);
  8. ?>
  9. </pre>

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


me entedes lo que te digo ahora "amigo"?
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mostrar carácteres en TextBox
.NET (C#, VB.NET, ASP)
TheKillerWantsYou 1 2,553 Último mensaje 31 Enero 2010, 18:05 pm
por seba123neo
Anular la opcion "mostrar caracteres" XP/Vista/7
Wireless en Windows
Reinel 1 6,890 Último mensaje 10 Mayo 2010, 17:23 pm
por Reinel
Necesito mostrar caracteres Hexadecimales en C++
Programación C/C++
zikotik 6 2,091 Último mensaje 8 Diciembre 2012, 20:27 pm
por zikotik
Mostrar todos los caracteres en Excel
Dudas Generales
Xedrox 0 950 Último mensaje 5 Enero 2013, 02:28 am
por Xedrox
dominios con acento. « 1 2 »
Dudas Generales
skan 18 5,857 Último mensaje 28 Octubre 2013, 14:27 pm
por skan
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines