viernes, 26 de febrero de 2010

Convertir UTF8 a ASCII

En el siglo XXI, todos los sistemas operativos modernos soportan caracteres multibyte (UTF8, UTF16...), las bases de datos es buena idea crearlas también con un juego de caracteres que posteriormente pueda albergar textos en cualquier idioma.

En el caso de Postgres lo ideal es crear la base de datos así:


CREATE DATABASE mi_bbdd
WITH OWNER = yo_mismo
ENCODING = 'UTF8'
LC_COLLATE = 'es_ES.UTF-8'
LC_CTYPE = 'es_ES.UTF-8';


Una vez guardados los datos podemos recuperarlos con distintos juegos de caracteres, cambiando la variable de entorno client_encoding. Por ejemplo dentro de psql si quieres saber que client_encoding tienes actualmente teclea:



mi_bbdd=> show client_encoding;
client_encoding
-----------------
UTF8
(1 fila)

Si queremos forzar la codificación a otro juego de caracteres, como por ejemplo "latin1" usariamos set client_encoding:


mi_bbdd=>set client_encoding='latin1';
SET
mi_bbdd=>show client_encoding;
client_encoding
-----------------
latin1
(1 fila)

Todo esto está muy bien, porque a veces tienes que extraer datos de la base de datos para incorporarlos a otras bases de datos o aplicaciones.


Imaginaos que tenéis que enviar datos a un sistema muy antiguo, que no soporta la codificación utf8, yo intenté infructuosamente extraerlos a través de una consulta programada en un script bash, usando client_encoding.


Por si os encontráis en la misma situación, os recomiendo que no hagais client_encoding en las consultas y que las hagais en UTF8 de forma normal. Cuando tengais los ficheros generados, entonces aplicar la conversión de juegos de caracteres usando iconv, una función de Linux, que funciona del siguiente modo:



iconv -f UTF-8 -t ISO_8859-1 fichero_entrada -o fichero_salida

Espero que os haya resultado de ayuda.