|
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 la página principal de Batiburrillo.net (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:
| Código: |
|
<?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:
| Código: |
|
<?php
set_time_limit(0);
$file = "http://medios.batiburrillo.net/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");
}
}
?> |
Hemos señalado con color azul los
lugares en los que hemos incluido la función de
decodificación de los caracteres especiales escritos en el
código UFT-8.
|