> Manuales > Taller de PHP

El buscador personalizado de Google Coop tiene un problema con los acentos. Mostramos como solucionarlo para que el motor de búsqueda Co-op permita acentos sin dar errores.

Google Custom Search Engine es un buscador personalizado que ofrece Google como servicio, para incorporar en una página web un motor de búsqueda que muestra resultados en las webs que se indique. En un artículo anterior de DesarrolloWeb.com ya publicamos algunas informaciones sobre este interesante servicio: Google Co-op, tu propio buscador personalizado.

En este artículo vamos a hablar del tema de los acentos en el sistema de Google Coop, que da errores poco descriptivos que pueden hacer creer al usuario que tu página no funciona correctamente.

Actualizado: Este servicio de Google ha cambiado el nombre desde cuando nosotros publicamos este artículo. Ahora se llama Custom Search Engine (CSE) y antes se llamaba Co-op. Realmente que nos gusta mucho más el nombre actual, aunque nos referiremos casi siempre a través de Co-op, pues es como se llamaba al escribir este texto.

Actualizado: Este artículo lo escribí hace tiempo, cuando acababa de salir Google Custom Search Engine (CSE). En castellano se le da el nombre de Google Búsqueda Personalizada. En aquel momento no existían tantas opciones de configuración y personalización del buscador, por ello no había otra manera, o al menos no la encontré, de solucionar el problema de los acentos. Afortunadamente, el equipo de Google ha ido mejorando mucho el buscador y ahora todo este tema relacionado con los acentos que comento en este artículo y doy solución, no es realmente un problema si sabemos configurar el buscador.

De modo que, en el panel de control de Google CSE tienes que buscar la opción de Configuración de idioma > Codificación del motor de búsqueda. Entonces encontrarás un select que te permite escoger entre varias configuraciones. Nosotros para DesarrolloWeb.com tenemos seleccionada la opción "Europa Occidental o Latin-1 (ISO-8859-1)". Pero tendréis que seleccionar la misma codificación de caracteres que estéis utilizando en vuestra web.

Con esta sencilla opción todo debe funcionar... no obstante, aseguraros que en la página que se realiza la búsqueda estéis trabajando con esa misma codificación de caracteres.

Ahora dejo el texto antiguo de este artículo, por si a alguien le sirve de algo ver la chapuzilla que hacíamos antes para arreglar este tema de los acentos en el motor de búsqueda personalizado de Google.

Podéis comprobarlo por vosotros mismos, si buscamos con una palabra acentuada en DesarrolloWeb.com, que utiliza el buscador de Google Co-op, nos devuelve una página vacía. No ofrece ningún error, pero tampoco ofrece ningún resultado, por lo que puede parecer que la página no está funcionando. (En nuestro caso mostramos un error por nuestra cuenta, pero google coop no muestra nada por el solo)

El problema de los acentos es debido al juego de caracteres que estamos utilizando. En realidad, el sistema de Google Coop funciona perfectamente con los acentos, lo que pasa es que tenemos que utilizar el juego de caracteres utf-8.

Si metemos esta línea en la cabecera del html, dentro de HEAD, podremos ver como el buscador, aunque busquemos palabras con acentos, funciona correctamente:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

Con ello estamos marcando que el juego de caracteres debe ser utf-8.

El problema de utilizar utf-8 es que a menudo los acentos se ven de manera incorrecta, con un carácter raro. A no ser que utilicemos caracteres especiales, los acentos que pongamos en la página se verán transformados en muchos casos a un código raro que queda muy feo. Esto también tiene que ver con el editor web que estemos utilizando y si tiene compatibilidad con el juego de caracteres UTF-8, así permitiría a los navegadores tratar bien los acentos al trabajar con UTF-8.

Está claro que todos deberíamos utilizar caracteres especiales para asegurarnos que los acentos y otros caracteres se ven correctamente en todos los casos, pero a veces, por la razón que sea, no los utilizamos. En DesarrolloWeb.com, de hecho, para no tener problemas con los acentos utilizamos el juego de caracteres ISO-8859-1. Nosotros no siempre utilizamos caracteres especiales y además la codificación de nuestros archivos de texto con código o con los manuales está en ANSI de 8 bit (un problema que arrastramos desde hace mucho tiempo y requeriría volver a codificar todas la página y revisar todos los artículos). El problema es que con el buscador Google Coop ISO-8859-1 no funciona bien y los acentos se le atragantan, y con ello se desata el problema que comentaba al principio.

Entonces ¿Qué hacer para que Google Coop funcione correctamente y que nuestra página también muestre bien los acentos? ¿Qué juego de caracteres utilizar UTF-8 o ISO-8859-1? Pues voy a contar la solución que he tomado yo, que quizás no sea la mejor y sea una simple chapuza, pero los resultados, más o menos, me parecen satisfactorios.

La en la página web en general utilizo el juego de caracteres ISO-8859-1, para lo que en la cabecera tenemos esta declaración:

<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1">

Luego, cuando muestro las páginas del buscador CO-OP, utilizo el juego de caracteres UTF-8, con la declaración META vista al comienzo del artículo. Para saber si estoy o no en una página del buscador utilizo una variable global, aunque podría haber utilizado alguna de las variables de $_SERVER. Hago algo como esto:

<?
if (isset($GLOBALS["estoy_en_buscador_google_coop"]))
   echo '<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />';
else
   echo '<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1">';
?>


En las páginas que quiero utilizar google coop declaro al comienzo una variable:

$estoy_en_buscador_google_coop=true;

De esta manera, una vez dentro del buscador ya utilizamos utf-8 y entonces cualquier búsqueda que se realice con o sin acentos dará resultados correctos.

El problema son las búsquedas realizadas desde cualquier otra de las páginas del sitio web, que tenían codificación ISO-8859-1. Entonces la cadena de búsqueda enviada al buscador con codificación ISO da problemas. Lo que hacemos, y aquí está la chapucilla, es buscar si la palabra que está buscando el usuario tiene acentos, porque entonces sabemos que Google Coop no va a dar ningún resultado. Entonces en este caso lo que hacemos nosotros es mostrar un mensaje de error informando al usuario que tenemos un problema con los acentos.

function tiene_acentos($cadena){
   $acentos = "áéíóúüÁÉÍÓÚÜñÑ";
   for ($i=0; $i<strlen($cadena); $i++){
      if (strpos($acentos, substr($cadena,$i,1))!==false)
         return true;
   }
   return false;
}

//echo "<!-- " . $_GET["q"] . "-->";

if (isset($_GET["dw"]) && tiene_acentos($_GET["q"])){
   echo "<p><br><br><i>Has intentado buscar una palabra con acentos</i></p>";
   echo "<p>Por favor, repite la búsqueda ahora para que funcione correctamente, que hemos activado la compatibilidad con acentos. O bien, prueba a realizar la búsqueda de la palabra sin acentuar.</p><br><br>";
}
?>


Como las páginas del buscador ya las estamos mostrando con UTF-8, las nuevas búsquedas que realicen los usuarios con el buscador funcionarán correctamente. Así que en el mensaje que mostramos al usuario en caso de detectar un acento, nos permitimos el lujo de decir que hemos activado la compatibilidad con acentos y que pruebe a hacer la búsqueda de nuevo, con o sin acentos, que funcionará perfectamente.

Espero que hayamos podido aclarar nuestra solución y que no sea considerada demasiado chapucera. Aceptamos comentarios.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual