Sitios web

Texto en ISO 8895-1 a partir de datos en UTF-8

Los caracteres que se muestran en una página web o que se almacenan en una base de datos pueden estar codificados en distintos formatos de caracteres. El formato UTF-8 (8-bit Unicode Transformation format) utiliza, para representar los alfabetos de una gran cantidad de lenguajes, grupos de bytes en el estándar Unicode. Se utiliza en una gran cantidad de páginas web escritas en diversos idiomas, entre los que se encuentra el castellano. La ISO 8895-1 define la codificación de los caracteres latinos, incluyendo las letras acentuadas y cualquier otro diacrítico. Vale para escribir cualquier lengua de Europa Occidental.

El problema surge cuando se quieren mostrar en una página con codificación ISO 8895-1 caracteres procedentes de una base de datos codificada con UTF-8. A nosotros nos ha ocurrido al querer mostrar en una página (en ISO 8895-1) los últimos artículos escritos en un blog hecho con WordPress y, por consiguiente, y con el fin de respetar las normas, codificado en UTF-8. Teníamos el script para leer el RSS pero al insertarlo en la página aparecían caracteres extraños.

¿Cómo lo solucionamos?

Muy fácilmente. Recurrimos a una función implementada por defecto en la mayoría de las versiones de PHP, utf8_decode.

De esta forma si los datos están dentro de una base de datos codificada en UTF-8, no habrá desajuste a la hora de mostrar los caracteres especiales en ISO 8895-1. Tendríamos que hacer algo similar a lo siguiente:

<?php
echo "utf8_decode( $datos_utf8 )";
?>

En nuestro caso, el script para leer el documento XML, codificado en UTF-8, y mostrar los resultados en una página codificada en ISO 8895-1, sería el siguiente:

<?php
set_time_limit(0);
$file = "http://www.dominio.com/wp-rss2.php";
$rss_channel = array();
$currently_writing = "";
$main = "";
$item_counter = 0;
function startElement($parser, $name, $attrs) {
global $rss_channel, $currently_writing, $main;
switch($name) {
case "RSS":
case "RDF:RDF":
case "ITEMS":
$currently_writing = "";
break;
case "CHANNEL":
$main = "CHANNEL";
break;
case "IMAGE":
$main = "IMAGE";
$rss_channel["IMAGE"] = array();
break;
case "ITEM":
$main = "ITEMS";
break;
default:
$currently_writing = $name;
break;
}
}
function endElement($parser, $name) {
global $rss_channel, $currently_writing, $item_counter;
$currently_writing = "";
if ($name == "ITEM") {
$item_counter++;
}
}
function characterData($parser, $data) {
global $rss_channel, $currently_writing, $main, $item_counter;
if ($currently_writing != "") {
switch($main) {
case "CHANNEL":
if (isset($rss_channel[$currently_writing])) {
$rss_channel[$currently_writing] .= $data;
} else {
$rss_channel[$currently_writing] = $data;
}
break;
case "IMAGE":
if (isset($rss_channel[$main][$currently_writing])) {
$rss_channel[$main][$currently_writing] .= $data;
} else {
$rss_channel[$main][$currently_writing] = $data;
}
break;
case "ITEMS":
if (isset($rss_channel[$main][$item_counter][$currently_writing])) {
$rss_channel[$main][$item_counter][$currently_writing] .= $data;
} else {
$rss_channel[$main][$item_counter][$currently_writing] = $data;
}
break;
}
}
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("No se puede abrir el archivo XML");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
if (isset($rss_channel["ITEMS"])) {
if (count($rss_channel["ITEMS"]) > 0) {
for($i = 0;$i < 13;$i++) {
if (isset($rss_channel["ITEMS"][$i]["LINK"])) {
print ("\n- <a href=\"" . $rss_channel["ITEMS"][$i]["LINK"] . 
"\". target=_blank>"."<b>" .
 utf8_decode($rss_channel["ITEMS"][$i]["TITLE"]) ."</b>". "</a><br />");
} else {
print ("\n" . utf8_decode($rss_channel["ITEMS"][$i]["TITLE"]) . "");
}
}
} else {
print ("No hay contenidos");
}
}
?>

Fabriciano González

Amante de la informática y de Internet entre otras muchas pasiones. Leo, descifro, interpreto, combino y escribo. Lo hago para seguir viviendo y disfrutando. Trato de dominar el tiempo para que no me esclavice.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.