Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Lupin en 15 Septiembre 2011, 03:02 am



Título: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 15 Septiembre 2011, 03:02 am
Estaba realizando un feed RSS
y la verdad mis datos de mi base de datos estan asi por ejemplo:
Datos reales
Citar
"Albert Einsteín"
Datos que deben mostrar
Citar
"Albert Einsteín"
Y la verdad en la parte del RSS
Citar
<title><![CDATA["Albert Einste&amp;iacute;n"]]></title>\n"; 
No me arrojan los acentos ni las Ñ..
que por cierto si lo hace en una pagina normal decodificando con html_entity_decode
La verdad no entiendo porque el RSS o  XML no lo interpreta. Estoy usando
encoding="UTF-8"
He usado todas las funciones posibles htmlentities , utf8_decode , utf8_encode pero no pasa nada...incluso he sacado la etiqueta <![CDATA
y en el mejor de los casos la etiqueta <description> si me interpreta las ñ y los acentos sin poner ninguna funcion pero el <title> no lo hace !!! Llevo dias en esto... >:(


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Nakp en 15 Septiembre 2011, 03:11 am
tendrás que usar html_entity_decode en tus datos para quitar las entities, y si es necesario, codificarlo en el charset que se supone que usa el feed


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: WHK en 15 Septiembre 2011, 03:38 am
Para eso existe la codificación iso-8859-1

Wordpress lo sabe y todos los archivos de la traducción en español incluyendo base de datos utiliza esta codificación.

De hecho simplemachines y joomla también utilizan esta codificación para traducciones en español.

Haz la prueba y vee el código fuente de este foro:

Citar
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
   <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Responder al mensaje</title>
        <link rel="stylesheet" type="text/css" href="https://foro.elhacker.net/Themes/converted/css/style.css">

No porque utf8 sea mas extenso va a querer decir que es mas flexible.
Por lo contrario causa problemas de seguridad ya que vas a tener problemas al guardar datos desde cajas de texto o mostrar datos desde la base de datos y vas a estar obligado a manipular siempre htmlentities impidiendo que la gente use el buscador con acentos y cosas por el estilo.

En mi caso desde el core de un sistema declaro que el título del sitio web se llamará "Última prueba", si, si... con acento en la primera U, pero la función que lo va a mostrar en pantalla va a utilizar htmlspecialchars para evitar XSS si es que alguien se le ocurre poner desde la base de datos alguna inyección de código, pero el problema es que si trabajo en utf8 tendré que estar utilizando constantemente utf8 encode desde php para guardar los datos en la db ya que si los paso a htmlentities entonces voy a tener doble filtro y en ves de verse un acento solo se va a ver carácteres basura.

Por eso siempre utilizo en sistemas latinos la codificación iso, para evitar algunos problemas de seguridad y guardar los datos en la db lo mas fiel posible.


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 15 Septiembre 2011, 03:41 am
Bueno la verdad le he aplicado hml_entity_decode a los datos algo asi por ejemplo
Citar
<title><![CDATA[html_entity_decode("Albert Einste&amp;iacute;n")]]></title>\n";
pero ne ha funcionado
Estoy usando esta codificacion:
Citar
header('Content-Type: text/xml'); 
    echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n"; 
    echo '<rss version="2.0" '."\n"; 
Bueno con respecto al charset...he visto codigos donde embeben la codificacion RSS dentro del html (<html><head></head><boby></body>...) pero no los he llegado ha hacer funcionar pues le quitan el formato al RSS..pero pensandolo bien puede que le problema vaya por alli...


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: WHK en 15 Septiembre 2011, 03:44 am
ojala que donde dice albert einstein no sea algo dinamico porque es vulnerable a xss.

Ves lo que decia? al usar utf8 vas a tener que codificar, recodificar, decodificar, etc.


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 15 Septiembre 2011, 03:51 am
Bueno si  ;D
Pero en mi base de datos  pretendo guardar caracteres unicode para caracteres extraños (nombres hebreos) y el UTF-8 lo vi como buena alternativa...aunque me has hecho dudar !! XD
He estado intentando embeber el feed dentro
Citar
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
   <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Responder al mensaje</title>
        <link rel="stylesheet" type="text/css" href="https://foro.elhacker.net/Themes/converted/css/style.css">
pero como repito pierde el formato y temo que no se abien interpretado
¿tienes algun ejemplo ,WHK? 
Gracias por las molestias


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 21 Septiembre 2011, 22:10 pm
Bueno hasta ahora he logrado que se interpreten las ñ y acentos en la etiqueta  <description> pero lo hice eliminando <![CDATA['...']]> que es para introcir html dentro del formato; con respecto al titulo aun eliminanado  <![CDATA['...']]>  las ñ no se interpretan...vaya problema !!!!


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: WHK en 22 Septiembre 2011, 12:14 pm
dame la url de la web para darle un vistazo


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 22 Septiembre 2011, 22:09 pm
Bueno la verdad lo estoy probando a nivel localm pero aqui esta mi code..y con esto Arme mi BD en mysql para aceptar caracteres extraños
Código:
CREATE DATABASE  adventures DEFAULT CHARACTER SET utf8 COLLATE  ...utf8_spanish2_ci;
, la verdad todo va bien al presentarlo en html lo decodifico con html_entity_decode
y para proteger los datos ingresar los datos utilizo
htmlentities ($texto ,ENT_QUOTES,'UTF-8');
htmlspecialchars ($texto ,ENT_QUOTES,'UTF-8')

El code de mi RSS es
Código
  1. <?php
  2. $config = array();  
  3.    $sql_link = mysql_connect("localhost", "root", "password") or die(mysql_error($sql_link));  
  4.    mysql_select_db("adventures",$sql_link);  
  5.    $urlmain = "http://mi-web.com/";  
  6.    $site = "Mi WebSite";  
  7.    header('Content-Type: text/xml');  
  8.    echo '<?xml version="1.0" encoding="UTF-8"?>' . "\n";  
  9.    echo '<rss version="2.0" '."\n";  
  10.    echo '     xmlns:content="http://purl.org/rss/1.0/modules/content/"'."\n";  
  11.    echo '     xmlns:wfw="http://wellformedweb.org/CommentAPI/"'."\n";  
  12.    echo '     xmlns:dc="http://purl.org/dc/elements/1.1/"'."\n";  
  13.    echo ' >'. "\n";  
  14.    echo '<channel>'."\n";  
  15.    echo"   <title>".utf8_encode($site)."</title>"."\n";  
  16.    echo"   <link>".$urlmain."rss/rss.php?id=x</link>"."\n";  
  17.    echo"   <image><title>".utf8_encode($site)."</title><link>".$urlmain."</link><url>".$urlmain."images/logo.jpg</url></image>\n";  
  18.    echo"   <description>".utf8_encode(" Very Good")."</description>"."\n";  
  19.    $fecha = date("Y-m-d h:i:s");  
  20.        $ano = substr($fecha, 0, 4);  
  21.        $mes = substr($fecha, 5, 2);  
  22.        $dia = substr($fecha, 8, 2);  
  23.        $hora = substr($fecha, 11, 2);  
  24.        $min = substr($fecha, 14, 2);  
  25.        $seg = substr($fecha, 17, 2);  
  26.        $pubdate0 = date('D, d M Y H:i:s O', mktime($hora, $min, $seg, $mes, $dia, $ano));  
  27.    echo"   <pubDate>$pubdate0</pubDate>"."\n";  
  28.    echo"   <generator>$urlmain</generator>"."\n";  
  29.    echo'   <language>en-us</language>'."\n\n";  
  30.    $q = "SELECT * FROM articulos order by id_articulo desc limit 14"; // el limite varía dependiendo de las necesidades  
  31.    $r = mysql_query($q, $sql_link);  
  32.    while($row = mysql_fetch_array($r)){ // bucle para volcar los datos de la base de datos mysql  
  33. // esto es para obtener el link
  34.  
  35. $link_comic = $row['link'] ;
  36. //print "jeje ".$link_comic ;
  37. //Extrayendo id_historia del $link_comic
  38.  $id_de_historia =trim(substr($link_comic,0,3));
  39. //Extrayendo id_capitulo  absuluto del $link_comic
  40.  $id_de_capitulo =trim(substr($link_comic,3,3));
  41. //Extrayendo id_pagina  absoluto del $link_comic
  42.  $id_de_pagina  =trim(substr($link_comic,6,3));
  43.  
  44. //obteniendo id_capitulo  RELATIVO
  45. $consulta = "Select * from capitulos where id_historia= '$id_de_historia';";
  46. $sql= mysql_query($consulta);
  47.    $contador=0;
  48. while($rowcapt = mysql_fetch_assoc($sql))
  49. {
  50. if(!($rowcapt['id_capitulo']==$id_de_capitulo))
  51. {
  52. $contador++;
  53. }else{
  54. $contador++;
  55. break ;
  56.    }
  57.  
  58. }
  59.  
  60. //print "Eso corresponde a: ".$contador;
  61.  
  62.  
  63. //obteniendo id_pagina  RELATIVO
  64. $consulta =
  65. "Select * from paginas where id_historia= '$id_de_historia' and id_capitulo=
  66. '$id_de_capitulo';";
  67.  
  68. $sql= mysql_query($consulta);
  69.    $id_pagina_relativa=0;
  70. while($rowpag = mysql_fetch_assoc($sql))
  71. {
  72. if(!($rowpag['id_pagina']==$id_de_pagina))
  73. {
  74. $id_pagina_relativa++;
  75. }else{
  76. $id_pagina_relativa++;
  77. break ;
  78.    }
  79.  
  80. }
  81. //print "<br>Eso corresponde a la pagina : ".$id_pagina_relativa;
  82.  
  83.  
  84. //**************fin de obtener el link
  85.  
  86.  
  87.        $ano = substr($row[fecha], 0, 4);  
  88.        $mes = substr($row[fecha], 5, 2);  
  89.        $dia = substr($row[fecha], 8, 2);  
  90.        $hora = substr($row[fecha], 11, 2);  
  91.        $min = substr($row[fecha], 14, 2);  
  92.        $seg = substr($row[fecha], 17, 2);  
  93.        $pubdate = date('D, d M Y H:i:s O', mktime($hora, $min, $seg, $mes, $dia, $ano));  
  94.            echo "  <item>\n";  
  95.            echo "      <title>".utf8_decode($row[titulo])."</title>\n";  
  96.            echo "      <link>".$urlmain."page_web.php?id="."http://mi-web.com"."</link>\n";  
  97.            echo "      <comments>".$urlmain."page_web.php?id=".$row[encabezado]."</comments>\n";  
  98.            echo "      <pubDate>$pubdate</pubDate>\n";  
  99.            echo "      <dc:creator>".$row[campo4]."</dc:creator>\n";  
  100.            echo "      <category>"."Comic"."</category>\n";  
  101.            echo "      <guid>".$urlmain."page_web.php?id=".$row[campo6]."</guid>\n";  
  102.            echo '      <description><![CDATA[';  
  103.            echo '<p><a href="'.$urlmain.'comic.php?hist='.$id_de_historia.'&capt='.$id_de_capitulo."&accion=s&id_pagina=".$id_de_pagina."&pag=".$id_pagina_relativa.'#ancla"><img src="'.$urlmain."images/articulos/miniaturas/".substr("000".$row[id_articulo], -3).'.jpg" border="0"/></a></p>'; //inclir imagenes en el contenido  
  104.            echo "<p>".utf8_encode($row[encabezado])."</p>";                        //incluir contenido de la base de datos  
  105.            echo "<p>".utf8_encode("")."</p>";                   //incluir contenido directo  
  106.            echo "]]></description>\n";  
  107.            echo "      <wfw:commentRss>".$urlmain."</wfw:commentRss>"."\n";  
  108.            echo "  </item>\n";  
  109.    }  
  110.    echo "</channel>\n</rss>\n";
  111.  
  112.    ?>  
  113.  
  114.  
El code lo encontre en una pagina web, debe haber mejores seguro pero este me iba bien salvo por el problema de las benditas Ñ y acentos!!!...
P.D.: Lamento el desorden del codigo XD !!!


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: WHK en 24 Septiembre 2011, 01:12 am
Sacales los utf8-encode y decode, eliminalos, cambia la cabecera donde dice
<?xml version="1.0" encoding="UTF-8"?>
ponle:
<?xml version="1.0" encoding="ISO-8859-1"?>

La base de datos cambiala de utf8_spanish2_ci a latin1_swedish_ci e ingresa los datos nuevamente, no uses los datos antiguos porque ya están codificados en utf8.

No uses
htmlentities ($texto ,ENT_QUOTES,'UTF-8');
Usa solamente htmlspecialchars($texto, ENT_QUOTES), no pongas la codificación al final.

Cuando hagas el archivo .php fijate que no esté en utf8, si usas notepad++ dale en la opción de formato > convertir en ANSI.

Te recomiendo utilizar en gedit para windows para corregir archivos basados en otras codificaciones, le das en guardar como y le pones que será ansi y saltos de linea de windows.

Cambia
header('Content-Type: text/xml');
por:
header('Content-Type: text/xml; charset=ISO-8859-1');


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 24 Septiembre 2011, 22:47 pm
Gracias por tu respuesta...lo pruebo ahora mismo y lo comento !!!  ;D


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 26 Septiembre 2011, 18:40 pm
No he podido convertir mi BD a latin1_swedish_ci estoy usando mysql 5.0.67 !!!! Unknow collation

CREATE DATABASE  adventures DEFAULT CHARACTER SET utf8 COLLATE  latin1_swedish_ci ;

Estoy creando  la base de datos de nuevo..


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: WHK en 26 Septiembre 2011, 19:42 pm
intenta dejarla como utf8 pero eso si que en el header del php y del html debe ir la codificación si o si.


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 27 Septiembre 2011, 00:46 am
Biennn !!!!
Gracias WHK !!!!
Parecia imposible y la verdad no hay mucha info para aclarar estas cosas..
hice todo lo que dijiste y deje la base de datos como la tenia antes
y para proteger los datos use solo htmlspecialchars($texto, ENT_QUOTES) como mencionaste
Cambie la codificacion de la pagina que me muestra los datos de RSS ( incluso de otras paginas ) modificando el charset  ó en dreamweber propiedades de pagina/tilulo codificacion/ codificacion=Europeo occidental (yo la tenia en unicode UTF-8).
He revisado mi base de datos para mirar como guarda los datos y me he fijado que no usa entidades especiales si no caracteres extraños,esa seria mi unica duda...Pero lo importante es que me interpreta caracteres como por ejemplo en nombre en arabe de Shakira (شاكرة šākira) !!!!. Es más la data ocupa menos longitud al no usar entidades.  Gracias amigo ahora voy a cambiar todas mis paginas

 


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: yocarluis en 30 Septiembre 2011, 20:40 pm
Intenta utilizar un poco de php, hace tiempo implemente un Lector de RSS con una función que me proporciono Desarrolloweb.com.

Código:
function convertir_especiales_html($str){
   if (!isset($GLOBALS["carateres_latinos"])){
      $todas = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
      $etiquetas = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
      $GLOBALS["carateres_latinos"] = array_diff($todas, $etiquetas);
   }
   $str = strtr($str, $GLOBALS["carateres_latinos"]);
   return $str;
}

Ahora intenta llamar a la función de esta forma.
Código:
convertir_especiales_html('<p align="center">La ejecución de esta función sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcionó!</p>');

Devolveria un texto como el siguiente:
Código:
<p align="center">La ejecuci&oacute;n de esta funci&oacute;n sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcion&oacute;!</p>

Espero averte ayudado, saludos.

Más información
  • http://www.desarrolloweb.com/articulos/convertir-caracteres-especiales-php.html
  • http://yocarluis.wordpress.com/


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: WHK en 30 Septiembre 2011, 21:09 pm
Intenta utilizar un poco de php, hace tiempo implemente un Lector de RSS con una función que me proporciono Desarrolloweb.com.

Código:
function convertir_especiales_html($str){
   if (!isset($GLOBALS["carateres_latinos"])){
      $todas = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
      $etiquetas = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
      $GLOBALS["carateres_latinos"] = array_diff($todas, $etiquetas);
   }
   $str = strtr($str, $GLOBALS["carateres_latinos"]);
   return $str;
}

Ahora intenta llamar a la función de esta forma.
Código:
convertir_especiales_html('<p align="center">La ejecución de esta función sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcionó!</p>');

Devolveria un texto como el siguiente:
Código:
<p align="center">La ejecuci&oacute;n de esta funci&oacute;n sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcion&oacute;!</p>

Espero averte ayudado, saludos.

Más información
  • http://www.desarrolloweb.com/articulos/convertir-caracteres-especiales-php.html
  • http://yocarluis.wordpress.com/

Habría que tener demasiado cuidado porque eso tiene problemas de seguridad xss, si no filtras las etiquetas y alguien pone por ejemplo en un foro o blog un <script> entonces puedes hacerle bypass al sistema de seguridad nativo de tu sistema web.

La idea es buena pero demasiado inseguro, yo no lo usaría a menos que quiera que me roben las cuentas.


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: yocarluis en 30 Septiembre 2011, 23:15 pm
Habría que tener demasiado cuidado porque eso tiene problemas de seguridad xss, si no filtras las etiquetas y alguien pone por ejemplo en un foro o blog un <script> entonces puedes hacerle bypass al sistema de seguridad nativo de tu sistema web.

La idea es buena pero demasiado inseguro, yo no lo usaría a menos que quiera que me roben las cuentas.

Es Cierto amigo, pero eso quedaría a criterio de el, yo sugiero que implemente la información que le proporcione, es mucho más efectivo que el método básico con HTML, luego quedaría realizar un sistema de seguridad, muy sencillo no es demasiado, cualquier cosa enviar un mensaje privado y ayudo sin problemas.


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Carluís en 1 Octubre 2011, 00:03 am
Intenta utilizar un poco de php, hace tiempo implemente un Lector de RSS con una función que me proporciono Desarrolloweb.com.

Código:
function convertir_especiales_html($str){
   if (!isset($GLOBALS["carateres_latinos"])){
      $todas = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
      $etiquetas = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
      $GLOBALS["carateres_latinos"] = array_diff($todas, $etiquetas);
   }
   $str = strtr($str, $GLOBALS["carateres_latinos"]);
   return $str;
}

Ahora intenta llamar a la función de esta forma.
Código:
convertir_especiales_html('<p align="center">La ejecución de esta función sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcionó!</p>');

Devolveria un texto como el siguiente:
Código:
<p align="center">La ejecuci&oacute;n de esta funci&oacute;n sirve para <b>convertir caracteres especiales con PHP</b> sin tocar las etiquetas. <br>Parece que funcion&oacute;!</p>

Espero averte ayudado, saludos.

Más información
  • http://www.desarrolloweb.com/articulos/convertir-caracteres-especiales-php.html
  • http://yocarluis.wordpress.com/2011/09/30/caracteres-especiales-del-html-en-php/


Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Lupin en 3 Octubre 2011, 21:10 pm
Lamento la ignorancia pero como puedo mostrar las salidas  con  esta funcion convertir_especiales_html() me refiero a mostrarlas en el navegador.

Yo antes las mostraba con
   html_entity_decode();
Y  metia a la DB con
   htmlspecialchars



Título: Re: Problemas de Ñ y acentos en RSS
Publicado por: Carluís en 4 Octubre 2011, 02:44 am
Lamento la ignorancia pero como puedo mostrar las salidas  con  esta funcion convertir_especiales_html() me refiero a mostrarlas en el navegador.

Yo antes las mostraba con
   html_entity_decode();
Y  metia a la DB con
   htmlspecialchars



Amigo, facil, llama la función, un ejemplo sería el siguiente:

Código:
convertir_especiales_html('<title><![CDATA["Albert Einsteín"]]></title>');

Se mostraría de la siguiente manera:

Código:
<title><![CDATA["Albert Einste&amp;iacute;n"]]></title>

Te sugiero que me facilites más información acerca de tu falla estoy un poco desorientado, saludos.