[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