Desde hace bastante tiempo tengo problemas con mi blog WordPress y el PlanetPlanet, este último no era capaz de entender mi feed para agregar mis posts. Por lo poco que investigué averigué que se trataba del caracter & que no lo interpretaba bien el planet, la única solución que encontré era crear un feed nuevo donde no estuviesen todo el cuerpo de mis posts, sólo un pequeño resúmen y de esta forma en la mayoría de los casos evitaba llegar a cualquier &.
El error concreto que daba el planet:
INFO:root:Updating feed <http ://www.marblestation.com/blog/wp-rss2.php> DEBUG:root:Encoding: ISO-8859-1 DEBUG:root:E-Tag: "bc75f597ef208a8deaed7f6001f05cd8" DEBUG:root:URI: <http ://www.marblestation.com/blog/wp-rss2.php> ERROR:root:Update from <http ://www.marblestation.com/blog/wp-rss2.php> failed Traceback (most recent call last): File "planet.py", line 130, in ? channel.update() File "/opt/planet-devel/planetlib.py", line 169, in update self._update(baseuri, data) File "/opt/planet-devel/planetlib.py", line 273, in _update feed.feed(data) File "/usr/lib/python2.3/sgmllib.py", line 95, in feed self.goahead(0) File "/usr/lib/python2.3/sgmllib.py", line 134, in goahead k = self.parse_endtag(i) File "/usr/lib/python2.3/sgmllib.py", line 293, in parse_endtag self.finish_endtag(tag) File "/usr/lib/python2.3/sgmllib.py", line 333, in finish_endtag self.unknown_endtag(tag) File "/opt/planet-devel/feedparser.py", line 358, in unknown_endtag method() File "/opt/planet-devel/feedparser.py", line 778, in _end_content value = self.pop('content') File "/opt/planet-devel/feedparser.py", line 480, in pop output = resolveRelativeURIs(output, self.baseuri) File "/opt/planet-devel/feedparser.py", line 897, in resolveRelativeURIs data = p.output() File "/opt/planet-devel/feedparser.py", line 853, in output return "".join(self.pieces) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)
Más tarde, Tomàs empezó a utilizar también WordPress y acabó con los mismos problemas que yo con el planet 🙁 Però el si que empezó a investigar más profundamente cual era el problema y en uno de sus últimos posts encontró una solución.
Comenta que WordPress traduce el símbolo & como “& #038;” y es correcto si estamos tratando texto en formato ISO-8859-15, pero en el caso de UTF-8 el símbolo & debería ser expresado como “& #x0026;”. Así que la solución que encontró era cambiar el símbolo & (por lo visto solo los que se encuentran entre comillas, los demás no es necesario) por “& #x0026;”.
Hoy por fin me he decidido a aplicar la solución de Tomàs y me he leido con detenimiento su post, entonces me he dado cuenta que el tiene su blog completamente en UTF-8 y por tanto es lógico que la traducción del & que hace WordPress (según el parrafo anterior) sea incorrecta ya que mezcla ISO-8859-15 con UTF-8. Per en mi caso, lo tengo todo como ISO-8859-15 y por tanto la traducción que hace WordPress es correcta!! Utilizo ISO-8859-15 y WordPress traduce el símbolo & con el formato ISO-8859-15!! Por tanto, creo que aqui se han juntado 2 bugs:
- WordPress, a pesar de estar configurado con formato UTF-8, reemplaza los símbolos & por “& #038;” que corresponden al formato ISO-8859-15
- El Planet cuando obtiene notícias de un feed que esta en ISO-8859-15 falla al interpretar “& #038;” a pesar de que es correcto.
Por suerte he encontrado la solución muy rápidamente, he modificado el código fuente de WordPress para que traduzca los & en “& amp” en lugar de “& #038;”. De esta forma no falla cuando tienes la web en ISO-8859-15, no lo he probado con UTF-8… quizás lo pruebe Tomàs si se anima 😉
La modificación consiste en cambiar la linea 107 del fichero “wp-include/functions-formatting.php”:
--- functions-formatting.php 2004-08-08 13:27:59.000000000 +0200 +++ functions-formatting.php.new 2004-08-08 13:27:49.000000000 +0200 @@ -104,7 +104,7 @@ $content = preg_replace('/<category>(.+?)</category>/','',$content); // Converts lone & characters into & (a.k.a. &) - $content = preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&$1', $content); + $content = preg_replace('/&([^#])(?![a-z]{1,8};)/i', '&$1', $content); // Fix Word pasting $content = strtr($content, $wp_htmltranswinuni);