Python: UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u20ac’

Chiunque abbia fatto un minimo di parsing HTML tramite Python, ha incontrato almeno una volta questo fatidico errore (almeno lo spero, altrimenti sono l’unico pseudo smanettone ad averlo avuto 😛 ), soprattutto se il parsing e’ stato effettuato su pagine web in cui la valuta e’ l’Euro, dato che \u20ac rappresenta il simbolo “€” (dannato Euro, anche nel mondo dell’informatica ci da’ problemi).

Il problema deriva avviene quando Python cerca di codificare il simbolo  € con un carattere ASCII.

Codifica?? Uhm?? se sei confuso come me… continua a leggere 😀

Prima di continuare facciamo un piccolo ricapitolazione di “Fondamento di Informatica”…la cosa piu’ importante da sapere e’ che: l’oggetto str in Python memorizza il suo valore come bytes, cioe’ con una sequenza di 8-bit, a.k.a string. Per questo motivo ogni carattere ASCII viene codificato in 8-bit, questo vuol dire che abbiamo a disposizione 0-255 rappresentazioni diverse… ma questo non e’ sufficiente per rappresentare i caratteri Russi, Arabi, Giapponessi… ed il nostro famoso simbolo dell’euro.

Per superare questa limitazione, Python usa unicode che memorizza il carattere con 16-bit o 32-bit dandoci la possibilita’ di rappresentare qualsiasi simbolo in qualsiasi linguaggio.

Voi direste.. Evviva! basta usare l’unicode e risolvo il problema, giusto? NO, non puoi…. ci mancherebbe che il mondo dell’informatica sia cosi’ logico e “clean” 😀

In particolare, non si puo scrivere su un file usando l’unicode, perche’ il file vuole una stringa che sia rappresentata da 8-bit. Dato che Python e’ molto “smart” cerchera’ in automatico di codificare/uniformare il carattere in unicode per la scrittura su file (o qualsiasi altro stream, come la shell), ma ahime’ c’e’ un problema… vediamo meglio con un esempio.

[sourcecode language=”python”]
>>> price_info = u’the price is \u20ac 5′
>>> type(price_info)
<type ‘unicode’>
>>> f = open(‘priceinfo.txt’,’wb’)
>>> f.write(price_info)
Traceback (most recent call last):
File "", line 1, in ?
UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u20ac’ in position 9: ordinal not in range(128)
>>>
[/sourcecode]

What happened?? Quando Python cerca di scrivere nel file “the price is € 5”, egli cerca di trasformare il valore unicode ‘\u20ac‘ in un carattere ASCII ad 8-bit… ma prima abbiamo detto che ASCII non contiene il carattere in questione… per cui… mi stai seguendo?? 😀

La soluzione e’ semplice (dopo che ho passato almeno una nottata su stackoverflow 😛 ):

[sourcecode language=”python”]
>>> price_info_enc = price_info.encode(‘utf-8’) # >> price_info_enc
‘it costs \xe2\x82\xac 5’
>>> type(price_info_enc)
<type ‘str’>
>>> f.write(price_info_enc)
>>> f.close()
[/sourcecode]

Semplice!! abbiamo codificato l’unicode tramite ‘utf-8’, il quale usa una sequenza di 3 caratteri ‘\xe2\x82\xac‘ per rappresentare il simbolo dell’Euro , in questo modo possiamo passare facilmente da ‘utf-8′ ad ASCII.

Ovviamente nel caso volessimo leggere il simbolo al contrario ( cioe’ vedere sullo schermo il simbolo dell’euro) dovremmo procedere con la decodifica dei tre caratteri in ‘utf-8′ e poi effettuare il print 😉

Ma c’e’ davvero gente che legge i miei post??? Mmmm ne dubito… ma come sempre, questo post mi servira’ da qui ad una settimana, visto che la mia memoria e’ scarsa e mi capitera’ di nuovo di imbattermi in questo problema… spero almeno di ricordarmi di aver scritto qualcosa sull’argomento 😛

Scattare Foto in RAW o JPG?

RAW vs JPG

 

 

La prima domanda che mi sono posto, appena finito di leggere il manuale della mia Reflex, è stata:
Ma quale è la differenza tra il formato RAW e JPG?

 

Ovviamente dove esserci qualche differenza, visto che la foto ( massina risoluzione)  in RAW occupa circa 12 MB, mentre in formato JPG meno della metà. Essendo un aspirante geek ed un pessimo fotografo ( se non credetemi guardate il mio account su flickr 😀 ), ho deciso di informarmi sulla loro reale differenza e nelle righe successive cercherò di darvi una piccola panoramica sui due formati.

Inziamo subito con il dire che tutte le fotocamere, almeno le Reflex e le compatte di alta fascia, scattano le foto in RAW ( formato grezzo) e poi eventualmente le trasformano in JPG. Per tale motivo possiamo suddividere l’intero processo in due semplici fasi:

1) Acquisizione dell’ immagine dall’obiettivo in formato RAW
2) Rielaborazione (Interpolazione) delll’immagine e trasformazione in JPG.

Scattare una foto in RAW ci permette di eludere la seconda fase, cioè non viene effettuata la rielaborazione dell’immagine direttamente dall’ hardware dalla fotocamera, che spesso e’ molto piu’ veloce della rielaborazione sui nostri pc.
Il termine RAW, che in inglese significa: grezzo, non raffinato, non elaborato. Con tale tecnica l’immagine viene memorizzata nella sua forma originaria, numerica, cioè dopo essere stata solo convertita da analogico a digitale, senza nessuna ulteriore elaborazione da parte del processore della fotocamera.

Scattare una foto in RAW ci rilassa un po’ i vincoli, nel senso che ci possiamo anche permettere di fare qualche errore nella scelta dei parametri ( esposizione, bilanciamento del bianco ecc ) per poi sistemare il tutto in fase di post-produzione con il nostro bel programmino di Image Editing ( Ex. Photoshop o GIMP).

Scattare una foto in JPG ( soprattutto con le tecniche di interpolazione usate oggi dalle macchine fotografiche )direttamente con la nostra fotocamera, vuol dire far processare l’immagine direttamente dalla macchine permettendoci di avere ugualemente un’ ottima resa dell’immagine: colori, sfumatura, nitidezza ed ombre. Con il vantaggio di occupare molta meno memoria delle foto in formato RAW.

Su internet si trovano centinai di post, commenti o altro sulle due filosofie di acquisizione immagini… ovviamente ( se avete letto i nostri precedenti articoli ) avrete capito che qualsiasi domanda voi vi poniate, la risposta è : DIPENDE   😀

Caratteristiche del RAW:

  • Formato proprietario (.nef, .cr2 ecc… )
  • La maggior parte delle Macchine Fotografiche usa una profondita’ di colore a 12 bit
  • Non compressa ( Una macchina a 10 MegaPixel produce un file di 10 MB )
  • File in sola lettura ( di solito le modifiche vengono registrate nel file XMP associato al RAW originale)

Caratteristiche del JPG:

  • Standard Internazionale
  • Esattamente 8 bit per colore
  • Compresso ( si passa da 10 MB a circa 1.5 MB per Fine-JPG )
  • Il File puo’ essere modificato direttamente da qualsiasi programma di Editing di Immagini

In questo piccolo post ho cercato di esporvi i concetti fondamentali tra i due tipi di formati…
Io, essendo un puritano, scatto le mie foto solo in RAW e poi passo alla fase di rielaborazione e compressione ( JPG ) tramite il software fornito dalla mia fotocamera. Cio’ nonostante non considero affatto il JPG peggiore del RAW, anzi in qualche occasione e’ addirittura superiore vedi link, dato che conosco persone che scattano solo in JPG e che sono dei veri cultori della materia.

Daltronde, oggi le tecniche di interpolazione dell’immagine sono molto avanzate e questo ci permette di avere immagini in JPG nitide sulle quale e’ possibile interagire cosi’ come avviene sui file RAW.

 

Riferimenti:

http://www.kenrockwell.com/tech/raw.htm

http://www.digital-photography-school.com/raw-vs-jpeg

http://it.wikipedia.org/wiki/Raw_(fotografia)