UTF-8 a ISO-8859-1
From
Enric Lleal Serra@2:343/107.1 to
All on Wed May 21 10:17:08 2014
* Originally in ESP.SOFTBBS
* Crossposted in ESP.LINUX
* Crossposted in EOTB.BEHOLDERS
Hola All!
Como algunos sabéis, llevamos un tiempo peleándonos con la entrada de correos email en las conferencias de echomail a través de la pasarela de correo que está habilitada en "EOTB". Actualmente sólo están habilitadas las echos ESP.MSX
y ESP.PRUEBAS[1].
Bien, hay un gran problema cuando los correos entrantes se codifican con UTF-8 (GMail y Yahoo usan UTF-8, Hotmail usa ISO-8859-1) con cualquiera de las pasarelas que están habilitadas (demonio smtp nativo de BBBS o Soupgate+Spoon) lo único que se importa de estos correos es basura ininteligible en el cuerpo de los mensajes.
Para paliar esto, se ha trabajado en la conversión de los correos llegados en UTF-8 para pasarlos a ISO-8859-1.
La primera prueba se ha efectuado con la herramienta nativa "iconv", partiendo de un texto en UTF-8...
$ file -bi /tmp/utf8.txt
text/plain; charset=utf-8
...y convirtiéndolo...
$ iconv -f UTF-8 -t ISO-8859-1 /tmp/utf8.txt
...cosa que ha dejado patente que no hay una conversión directa[2] entre estas dos codificaciones. Para asegurarlo, se ha verificado individualmente toda la ristra de caracteres que se requeriría convertir específicamente: las vocales acentuadas, las ñ, las ç, signos de puntuación exclamación, etc...
$ echo -e "á" | iconv -f UTF-8 -t ISO-8859-1
...sin éxito. Vocales con tilde, Çs y Ñs, no se convierten.
Entonces, se ha pensado en la substitución de caracteres en dos pasos (de UTF-8
a una codificación personalizada, y de ésta a ISO-8859-1) como complemento a la
conversión directa que se efectúa en el intermedio.
Para ello, se ha tirado de "python" y de "sed" para utilizar el método ".encode" de python para cargar una variable con el valor UTF-8 a substituir, usando la variable con sed para hacer efectiva la substitución. Siguiendo con el caso de la "á"[3]...
$ CHARS=$(python -c 'print u"\u00E1".encode("utf8")')
$ sed 's/['"$CHARS"']/LATINSMALLLETTERAWITHACUTE/g' /tmp/utf8.txt
...para efectuar la conversión...
$ iconv -f UTF-8 -t ISO-8859-1 /tmp/utf8.txt
...y después hacer la substitución inversa[3]...
$ CHARS=$(python -c 'print u"\u00E1".encode("iso-8859-1")')
$ sed 's/LATINSMALLLETTERAWITHACUTE/['"$CHARS"']/g' /tmp/utf8.txt
...y la última substitución del texto donde se indica el charset[4]...
$ sed 's/charset=utf-8/charset=iso-8859-1/g' /tmp/utf8.txt
...verificando el resultado final...
$ file -bi /tmp/utf8.txt
text/plain; charset=iso-8859-1
...con lo que podríamos decir que sí es posible convertir un texto UTF-8 a ISO-8859-1.
El gran problema ha surgido a la hora de implementar esto en real, no contra un
texto generado sino contra un correo codificado en UTF-8 descargado por la herramienta SPOON, que es la encargada de preparar el correo para que SOUPGATE lo convierta a formato PKT y lo prepare para la conferencia echomail que toque.
SPOON descarga el correo. Si es en una codificación no UTF-8 los deja en un estado tratable, aptos para ser tratados/parseados/filtrados. Si la codificación es UTF-8, los deja de tal manera que el cuerpo del mensaje ya es el galimatías que veis en ESP.MSX o ESP.PRUEBAS.
Por tanto, el uso de la pasarela embebida de BBBS no es útil porque no permite tratar el correo entrante on-the-fly, y el uso de la pasarela Soupgate+Spoon tampoco es útil porque no permite tratar el correo que se descarga offline.
¿Otras vías?
La continuista. Actualmente las listas de correo vuelcan los correos en una cuenta pop3 que SPOON vacía/llena cuando toca. Una opción sería usar un buzón mbox o maildir, y tratar el correo de ahí o bien extrayendo los correos individuales dentro de cada mbox, o bien cogiéndolos directamente del maildir. Se podría intentar hacer que dichos correos se ajustaran al formato que genera SPOON (formato SOUP, con lista de .MSG indexados en un fichero índice). Pero debo analizarlo para ver si es factible, porque es una pasada de trabajo sin poder deducir si habrá éxito o no.
La cambiante. Mediante el uso de un cliente de correo en la mayoría de plataformas es posible fijar a LATIN-1 (ISO-8859-1) el juego de caracteres que usen los correos salientes. GMail incorpora la opción de cambiar dicho juego de
caracteres por defecto, de UTF-8 a ISO-8859-1. Llevo una semana con esto cambiado y no he tenido ningún problema/inconveniente en todas las listas de correo en las que participo. Todo funciona igual de bien con las dos opciones. Posiblemente pida alguna de esas opciones a los usuarios de la pasarela, pero como es una opción personal no puedo imponerla.
La cesante. Chapar la pasarela.
La primera requiere de un tiempo que ahora no tengo.
La segunda es la más factible.
La tercera no se contempla.
Así pues... me voy a por un café.
[1] La pasarela de News fuerza a priori el envío del mensaje en ISO-8859-1 con lo que no tenemos esos problemas.
[2] También con las opciones "TRANSLIT" o "-c", sin éxito.
[3] Y repetirlo para todos los caracteres que se quiere preservar en la conversión.
[4] Dejando para más adelante las variedades en la presentación de dicha codificación (mayúsculas, comillas, etc).
-
A reveure!!
Enric
__________________________________________________________________
FidoNet: 2:343/107.1 | beholderbbs.org | fidonet.cat | .es | .ws
InterNet: kishpa(at)kishpa(dot)com | kishpa.com | GPG#0xDCCB8CFC
... Quién vigila a los vigilantes?
--- crashmail + golded + binkd
* Origin: Black flag & crossed bones : Eye Of The Beholder BBS! (2:343/107.1)