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

michele a nectarine.it michele a nectarine.it
Mer 1 Ott 2008 14:33:23 CEST


On Wed, Oct 1, 2008 at 1:08 AM, Daniele Varrazzo <piro a develer.com> wrote:
>
>> input = open('foo.img','rb').read().decode('ISO-8859-1')
>
> Direi che non ha senso usare un encoding testuale per codificare
> un'immagine.

Sono d'accordo. Più avanti ti spiego perché sono stato costretto ad  
utilizzarli.

>> 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.

Sono due metodi di una libreria proprietaria che sto usando.
La segnatura di encode è (String data), mentre quella di decode è void.

>> 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.

Ok, il problema nasce dal fatto che se all'encoder passo una stringa  
fatta in questo modo, python si lamenta:

input = open('foo.img','rb').read()

Traceback (most recent call last):
   File "testing.py", line 32, in <module>
     d = encoder.encode(input)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xdc in position  
6: ordinal
not in range(128)

L'unico modo per non avere il decodeerror, è di fare il decode della  
stringa in input:
input = open('foo.img','rb').read().decode('ISO-8859-1')

ma a quel punto come sappiamo non ottengo il risultato corretto.
Sospetto che sia JPype che vuole una conversione forzata da str a  
unicode, ma perché lo forza? (vedi più avanti un caso in cui la  
conversione non viene forzata).
Ho provato anche a dare un'occhiata qui:
http://jpype.sourceforge.net/doc/user-guide/userguide.html#conversion
ma si indica chiaramente che le python str vengono convertite in java String.

> 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.

Devo soltanto chiamare la libreria di encoding passando come argomento  
una stringa con il contenuto del file (il file può essere qualsiasi,  
in questo caso è un file video). Il contenuto del file è rappresentato  
in una stringa (da python); nota che se il contenuto del file fosse,  
supponiamo:

input = "foo123"
d = encoder.encode(input)

in questo caso l'encoder funziona correttamente (e python non lamenta  
un unicodeerror).

La domanda è quindi: supposto che la libreria funziona correttamente,  
e nel caso in cui la stringa di input in python sia una semplice  
stringa di testo lo script funziona correttamente, perché sono  
costretto a fare il decode del file binario che passo allo script?

Grazie




Maggiori informazioni sulla lista Python