Problemas de Ñ y acentos en RSS

Iniciado por Lupin, 15 Septiembre 2011, 03:02 AM

0 Miembros y 1 Visitante están viendo este tema.

Lupin

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... >:(

Nakp

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
Ojo por ojo, y el mundo acabará ciego.

WHK

#2
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.

Lupin

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:
Citarheader('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...

WHK

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.

Lupin

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

Lupin

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 !!!!

WHK

dame la url de la web para darle un vistazo

Lupin

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

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 (php) [Seleccionar]

<?php 
$config = array();  
    
$sql_link mysql_connect("localhost""root""password") or die(mysql_error($sql_link));  
    
mysql_select_db("adventures",$sql_link);  
    
$urlmain "http://mi-web.com/";  
    
$site "Mi WebSite";  
    
header('Content-Type: text/xml');  
    echo 
'<?xml version="1.0" encoding="UTF-8"?>
' . "\n"; 
    echo '<rss version="2.0" '."\n"; 
    echo '     xmlns:content="http://purl.org/rss/1.0/modules/content/"'."\n"; 
    echo '     xmlns:wfw="http://wellformedweb.org/CommentAPI/"'."\n"; 
    echo '     xmlns:dc="http://purl.org/dc/elements/1.1/"'."\n"; 
    echo ' >'. "\n"; 
    echo '<channel>'."\n"; 
    echo"   <title>".utf8_encode($site)."</title>"."\n"; 
    echo"   <link>".$urlmain."rss/rss.php?id=x</link>"."\n"; 
    echo"   <image><title>".utf8_encode($site)."</title><link>".$urlmain."</link><url>".$urlmain."images/logo.jpg</url></image>\n"; 
    echo"   <description>".utf8_encode(" Very Good")."</description>"."\n"; 
    $fecha = date("Y-m-d h:i:s"); 
        $ano = substr($fecha, 0, 4); 
        $mes = substr($fecha, 5, 2); 
        $dia = substr($fecha, 8, 2); 
        $hora = substr($fecha, 11, 2); 
        $min = substr($fecha, 14, 2); 
        $seg = substr($fecha, 17, 2); 
        $pubdate0 = date('D, d M Y H:i:s O', mktime($hora, $min, $seg, $mes, $dia, $ano)); 
    echo"   <pubDate>$pubdate0</pubDate>"."\n"; 
    echo"   <generator>$urlmain</generator>"."\n"; 
    echo'   <language>en-us</language>'."\n\n"; 
    $q = "SELECT * FROM articulos order by id_articulo desc limit 14"; // el limite varía dependiendo de las necesidades 
    $r = mysql_query($q, $sql_link); 
    while($row = mysql_fetch_array($r)){ // bucle para volcar los datos de la base de datos mysql 
// esto es para obtener el link

$link_comic = $row['link'] ;
//print "jeje ".$link_comic ;
//Extrayendo id_historia del $link_comic
  $id_de_historia =trim(substr($link_comic,0,3));
//Extrayendo id_capitulo  absuluto del $link_comic
  $id_de_capitulo =trim(substr($link_comic,3,3));
//Extrayendo id_pagina  absoluto del $link_comic
  $id_de_pagina  =trim(substr($link_comic,6,3));

//obteniendo id_capitulo  RELATIVO
$consulta = "Select * from capitulos where id_historia= '$id_de_historia';";
$sql= mysql_query($consulta);
    $contador=0;
while($rowcapt = mysql_fetch_assoc($sql))
{
if(!($rowcapt['id_capitulo']==$id_de_capitulo))
{
$contador++;
}else{
$contador++;
break ;
    }

}

//print "Eso corresponde a: ".$contador;


//obteniendo id_pagina  RELATIVO
$consulta =
"Select * from paginas where id_historia= '$id_de_historia' and id_capitulo=
'$id_de_capitulo';";

$sql= mysql_query($consulta);
    $id_pagina_relativa=0;
while($rowpag = mysql_fetch_assoc($sql))
{
if(!($rowpag['id_pagina']==$id_de_pagina))
{
$id_pagina_relativa++;
}else{
$id_pagina_relativa++;
break ;
    }

}
//print "<br>Eso corresponde a la pagina : ".$id_pagina_relativa;


//**************fin de obtener el link


        $ano = substr($row[fecha], 0, 4); 
        $mes = substr($row[fecha], 5, 2); 
        $dia = substr($row[fecha], 8, 2); 
        $hora = substr($row[fecha], 11, 2); 
        $min = substr($row[fecha], 14, 2); 
        $seg = substr($row[fecha], 17, 2); 
        $pubdate = date('D, d M Y H:i:s O', mktime($hora, $min, $seg, $mes, $dia, $ano)); 
            echo "  <item>\n"; 
            echo "      <title>".utf8_decode($row[titulo])."</title>\n"; 
            echo "      <link>".$urlmain."page_web.php?id="."http://mi-web.com"."</link>\n"; 
            echo "      <comments>".$urlmain."page_web.php?id=".$row[encabezado]."</comments>\n"; 
            echo "      <pubDate>$pubdate</pubDate>\n"; 
            echo "      <dc:creator>".$row[campo4]."</dc:creator>\n"; 
            echo "      <category>"."Comic"."</category>\n"; 
            echo "      <guid>".$urlmain."page_web.php?id=".$row[campo6]."</guid>\n"; 
            echo '      <description><![CDATA['; 
            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 
            echo "<p>".utf8_encode($row[encabezado])."</p>";                        //incluir contenido de la base de datos 
            echo "<p>".utf8_encode("")."</p>";                   //incluir contenido directo 
            echo "]]></description>\n"; 
            echo "      <wfw:commentRss>".$urlmain."</wfw:commentRss>"."\n"; 
            echo "  </item>\n"; 
    } 
    echo "</channel>\n</rss>\n";

    ?> 


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 !!!

WHK

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');