[Python] Problemi con l'encoding/decoding dei locales

Daniele Varrazzo piro a develer.com
Mer 1 Ott 2008 01:08:45 CEST



On Tue, 30 Sep 2008 20:02:26 +0200, michele a nectarine.it wrote:
> Ciao,
> sto usando uno script Python in congiunzione con JPype, un framework  
> per usare classi Java in Python. Ho però un problema, forse legato ai 

> decoding/encoding dei locales.        ^^^^^
                                          |
Anche pi d'uno, legato agli encoding :) -+

> input = open('foo.img','rb').read().decode('ISO-8859-1')

Direi che non ha senso usare un encoding testuale per codificare
un'immagine.

> square = java.encoding(input)
> 
> output = java.decoding()
> 
> fd = open('foo_decode.img','wb')
> fd.write(output.encode('ISO-8859-1'))
> fd.close()
> sys.exit(0)
> 
> java.encoding e java.decoding sono due metodi che, rispettivamente,  
> prendono come argomento una java String e restituiscono una java  
> String. 

ok... e cosa fanno? Ho provato a cercare in
http://jpype.sourceforge.net/doc/user-guide/userguide.html ma non ho
trovato niente.

> JPype si occupa del bridging e converte una java String in una  
> python str o unicode string, e viceversa. Di conseguenza, input e  
> output, nel mio programma, sono due unicode.
> 
> Qual è il problema? Dovrei ottenere un output identico all'input  
> (byte per byte), ma non succede.

E cosa ottieni? Maggiori informazioni potrebbero aiutarci a diagnosticare
il problema.

Unicode  una rappresentazione di testo. Non credo sia ben definito cosa
succede se "codifichi" dei dati che non hanno significato in quanto testo.
Secondo me avresti dovuto lasciare la cosa come una stringa Python, che 
una sequenza di byte, pi adatta a rappresentare un contenuto binario.

> Prima di tutto: python mi ha "obbligato" ad usare il  
> .decode('ISO-8859-1') e .encode('ISO-8859-1'), altrimenti non avrebbe  
> letto/scritto il file specificato.

Non lo credo: la lettura avviene al "read()", il "decode()"  un metodo
chiamato sul risultato, che  il contenuto che  stato letto. Se poi hai
ottenuto un errore in scrittura,  stato probabilmente perch hai provato
a scrivere un oggetto unicode (appunto, dovendo scrivere in un file
binario, devi passargli una sequenza di byte: una sequenza di caratteri
unicode  ambigua): questo errore  causato dal fatto hce hai richiesto
un "decode" a monte.

> Inoltre, le librerie Java sono perfettamente funzionanti: ho provato  
> io stesso ad usarle tramite lo stesso input (foo.img) e all'uscita del  
> decoder ho ottenuto lo stesso file, quindi escludo degli errori delle  
> lib.
> 
> Sospetto che la differenza tra input e output siano dovute al  
> decoding/encoding di python: sono proprio necessari?
> Voi che ne pensate?

Non so cosa stai facendo: se devi lavorare con un'immagine (o altri dato
binari), unicode non  lo strumento adatto. Se devi lavorare con del
testo, unicode pu essere la cosa giusta, ma l'encoding di partenza devi
conoscerlo.

http://www.joelonsoftware.com/articles/Unicode.html

-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python