publikaccion @publikaccion

viernes, abril 25, 2008

.: Codificar y Decodificar en linux Base64 y UTF8 en Perl


El otro día volví a tener un problema de nuevo con el LDAP del proyecto en el que ando y con el famoso Base64 del OpenLDAP (para más información remitirse a un artículo anterior sobre el mismo tema), y bucenado un poco me encontré con unas instrucciones que a más de uno seguro que le van a sacar del paso en un momento cuando se cuentre con el mismo problema.

El problema viene siendo el mismo de siempre, y es que se pongan entradas en el DN de un LDAP con acentos o caracteres raros, de modo que cuando el LDAP hace un exportación de dicha entrada, nos la muestra como caracteres extraños y no comprensibles. Esto es la codificación en Base64.

Para decodificar dicho galimatías, basta con introducir la siguiente línea de texto en la línea de comandos:

echo | perl -MMIME::Base64 -ne 'print encode_base64($_) . "\n"'


que como ejemplo podría ser:

echo "Esto es un texto con eñes y acentos en las letras áéíóú" | perl -MMIME::Base64 -ne 'print encode_base64($_) . "\n"'


que nos devolvería la cadena de texto:

RXN0byBlcyB1biB0ZXh0byBjb24gZfFlcyB5IGFjZW50b3MgZW4gbGFzIGxldHJhcyDh6e3z+go=


y para volver a decodificar la cadena de Base64 a texto legible para nosotros tendríamos que poner en la línea de comandos Linux:

echo | perl -MMIME::Base64 -ne 'print decode_base64($_) . "\n"'


lo que para nuestro ejemplo sería:

echo "RXN0byBlcyB1biB0ZXh0byBjb24gZfFlcyB5IGFjZW50b3MgZW4gbGFzIGxldHJhcyDh6e3z+go=" | perl -MMIME::Base64 -ne 'print decode_base64($_) . "\n"'


lo que nos devolvería la cadena legible:

Esto es un texto con eñes y acentos en las letras áéíóú

Sin embargo tal y como comentaba en el anterior artículo, además de que OpenLDAP emplea Base64 para codificar los caracteres que no sean estándar (en nuestro caso los ISO Latin1 o ISO-8859-1), también codifica los acentos, eñes, cetillas, diéresis y demás "extraños" del ISO Latin1 en codificación UTF8.

Desde la línea de comandos de linux también tiene fácil solución empleando iconv.

De este modo si tenemos la siguiente cadena de caracteres que queremos codificar a UTF8:

El camión español chocó contra el pingüino en el término de Curação


y la introducimos en un archivo plano TXT que se llame isolatin1.txt empleamos desde la línea de comandos de linux:

iconv -f iso-8859-1 -t utf-8 isolatin1.txt > utfplano.txt


nos meterá en el utfplano.txt como salida la siguiente entrada:

El camión español chocó contra el pingüino en el término de Curação


que es nuestro texto codificado a UTF8.

Para decodificar el UTF8 del archivo utfplano.txt se emplearía sobre la línea de comandos linux:

iconv -f utf-8 -t iso-8859-1 utfplano.txt > isoplano.txt


lo que nos devolvería en nuestro isoplano.txt lo siguiente:

El camión español chocó contra el pingüino en el término de Curação


verificando de este modo que tenemos codificado correctamente el UTF8.

Ahora el texto codificado en UTF8, para transformarlo a Base64 desde línea de comandos sería del tipo:

echo "El camión español chocó contra el pingüino en el término de Curação" | perl -MMIME::Base64 -ne 'print encode_base64($_) . "\n"'


lo que nos devolvería:

RWwgY2FtacOzbiBlc3Bhw7FvbCBjaG9jw7MgY29udHJhIGVsIHBpbmfDvGlubyBlbiBlbCB0w6ly
bWlubyBkZSBDdXJhw6fDo28K


y para verificar que todo ha ido bien, decodificando Base64 a UTF8 sería:

echo "RWwgY2FtacOzbiBlc3Bhw7FvbCBjaG9jw7MgY29udHJhIGVsIHBpbmfDvGlubyBlbiBlbCB0w6lybWlubyBkZSBDdXJhw6fDo28K" | perl -MMIME::Base64 -ne 'print decode_base64($_) . "\n"'


lo que nos devolvería el texto en UTF8:

El camión español chocó contra el pingüino en el término de Curação


De este modo tenemos la transformación ISO Latin1 -> UTF8 -> Base64 que es el texto que finalmente estará en el OpenLDAP si el texto contiene acentos o cedillas o similares.

Para realizar la codificación desde archivos en Base64 (y la decodificación), tendríamos:

perl -MMIME::Base64 -ne 'print encode_base64($_) . "\n"' < utfplano.txt > encodedBase64.txt
perl -MMIME::Base64 -ne 'print decode_base64($_) . "\n"' < encodedBase64.txt > decodedBase64.txt


lo que nos daría como archivos:

utfplano.txt: Nuestro texto castellano formateado en UTF8 con los acentos y demás codificado en UTF8
encodedBase64.txt: Nuestro texto UTF8 codificado a Base64
decodedBase64.txt: Nuestro texto decodificado de Base64 en formato YTF8

Para volver a ver el texto de UTF8 en ISO Latin1 tendríamos:

iconv -f utf-8 -t iso-8859-1 decodedBase64.txt > isoplano.txt


Espero a que a alguien le sirva como me ha servido a mí...

No hay comentarios: