[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