Leggere un file iso8859-15 e convertirlo in utf8

Salve a tutti,
sto cercando di fare un parsing di un file di thunderbird che contiene i
testi di alcune email.

Il problema è che non riesco a visualizzare correttamente le lettere
accentate, vista la differenza di codifica del file e dei caratteri
riconosciuti da ruby (o da mac osx, non ho ancora capito… )

Ho capito (usando file nomefile) che il file che sto cercando di aprire
è di tipo ISO-8859 mail text,
ma poi guardando nel pannello di thunderbird vedo che la codifica per
tutte le mail è iso-8859-15 (dovrebbe essere equivalente a latin-9), e
la visualizzazione classica nella finestra di thunderbird è corretta, ma
quando si va a vedere il sorgente dell’email, si vedono gli stessi
caratteri che si trovano nel file salvato sull’hard disk.

Il codice ruby che uso è il seguente: apro il file in questione nella
classe Mailbox e provo a convertire ogni stringa del file usando Iconv
(ho scoperto che usa proprio l’iconv installato nel sistema) e converto
da LATIN-9 a UTF8.

def initialize(path_to_filename) File.open(path_to_filename) do
|file|
puts file.inspect
@file_lines = file.readlines
converter_to_utf = Iconv.new(“UTF8”, “LATIN-9”)

 @file_lines_converted = []
     @file_lines.each do |line|              puts line
   # conversion
   converted_line = converter_to_utf.iconv(line)
   puts converted_line
   @file_lines_converted << converted_line
 end
   end

Il problema è che non riconosce le lettere accentate, e le sostituisce
con =E0, =E9, etc etc…

Sono un po’confuso… Grazie in anticipo dell’aiuto.

ps: vi incollo di seguito il testo così come lo si legge sul file e
anche quando lo apro con textmate.

From - Thu Jul 3 01:51:37 2008


Internazionale
P R I M A P A G I N A
I titoli di apertura dei giornali di tutto il mondo

Mercoled=EC 2 luglio 2008
=3D> Domani accadr=E0

PUBBLICIT=C0

Puoi leggere Internazionale direttamente sul tuo computer,
sfogliando pagina per pagina la copia del giornale in
formato pdf. =C8 semplice, basta abbonarsi e scaricare il
numero.

https://pdf.internazionale.it

AL MEETIX DI GENOVA=20

GAYATRI CHAKRAVORTY SPIVAK
Filosofa statunitense di origine bengalese, insegna alla
Columbia University di New York. Ha costruito la sua
riflessione filosofica a partire dalla critica
dell’universalismo e dell’eurocentrismo.

Esperienze di transcultura

Venerd=EC 4 luglio 2008, Palazzo Ducale, Sala del Minor
Consiglio, ore 17.45, Genova

Info: www.palazzoducale.genova.it/naviga.asp?pagina=3D3693

ventidue. La polizia ha sparato e ucciso il guidatore, un
palestinese gi=E0 schedato dalla polizia. Anche se nessuna
org
L’opposizione democratica =E8 scesa in piazza protestando
contro presunti brogli. Durante le proteste le sedi
dell’Mprp sono stati incendiati e saccheggiati, pi=F9 di
cinquanta persone sono state ferite e centinaia arrestate.
Alcune fonti parlano di cinque morti non ancora confermate
dalle autorit=E0. =20

LE MONDE, Francia

L’Unione africana chiede un governo di unit=E0 nazionale in
Zimbabwe.

L’Unione africana ha chiesto allo Zimbambwe di formare un
governo di unit=E0 nazionale. La richiesta arriva dopo la
rielezione del
giugno dall’Unione europea =E8, secondo il Mercosur,
discriminatoria e viola i diritti umani e il diritto di
libera circolazione. Il Mercosur condanna la direttiva
europea sui migranti e dichiara che cercher=E0 di trovare un
modo per evitarne l’applicazione.=20


con l=92azienda tedesca.

Il problema è che non riconosce le lettere accentate, e le sostituisce
con =E0, =E9, etc etc…

Ciao,
se vuoi capire i dettagli dai una occhiata alla rfc2045 altrimenti
String#unpack fa al caso tuo.

Per esempio:
‘=3D> Domani accadr=E0’.unpack(‘M’).first

ti ritorna “=> Domani accadrà”.

Ciao,
Andrea

ZephirWorks.

Andrea C. Granata wrote:

Ciao,
se vuoi capire i dettagli dai una occhiata alla rfc2045 altrimenti
String#unpack fa al caso tuo.
Per esempio:
‘=3D> Domani accadr=E0’.unpack(‘M’).first
ti ritorna “=> Domani accadr�”.

Grazie Andrea, hai colto esattamente il problema, visto che nell’header
delle mail leggo:
Content-type: text/plain; charset=“ISO-8859-1”
Content-transfer-encoding: quoted-printable

non so per quale motivo, ma il risultato sul mio sistema non è lo
stesso:
irb(main):001:0> ‘=3D> Domani accadr=E0’.unpack(‘M’).first
=> “=> Domani accadr\340”

usando ruby -v: ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-darwin9]

ho fatto anche diverse prove, che copio di seguito:
irb(main):005:0> ‘=E0’.unpack(‘M’).first
=> “\340”
irb(main):006:0> "Ã "
=> “\303\240”
irb(main):014:0> puts ‘=E0’.unpack(‘M’).first
?
=> nil
irb(main):015:0> puts 'Ã '.unpack(‘M’).first
Ã
=>nil

(forse la cosa migliore è sostituire le occorrenze con delle espressioni
regolari?)

ok, credo di aver risolto con un altro passaggio intermedio:

irb(main):042:0> string = “=3D> Domani accadr=E0”
=> “=3D> Domani accadr=E0”
irb(main):043:0> unpacked_string = string.unpack(‘M’).first
=> “=> Domani accadr\340”
irb(main):044:0> require “iconv”
=> true
irb(main):045:0> converter_to_utf8 = Iconv.new(‘UTF-8’, ‘ISO-8859-1’)
=> #Iconv:0x1167014
irb(main):046:0> converter_to_utf8.iconv(unpacked_string)
=> “=> Domani accadr\303\240”
irb(main):047:0> puts converter_to_utf8.iconv(unpacked_string)
=> Domani accadrÃ
=> nil