[Python] insert à in db sqlite3

Daniele Varrazzo piro a develer.com
Mar 31 Ago 2010 18:01:59 CEST


On Tue, 31 Aug 2010 17:23:00 +0200, "Vittorio Zuccala'"
<vittorio.zuccala a gmail.com> wrote:

> Tutto funziona finchè non incontra lettere con accenti, apostrofi o cose
> strane.

Questa frase ha una certa universalità :)


> L'errore che mi restituisce è il seguente:
> 
> *"row[i]=unicode(row[i])
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4:
> ordinal not in range(128)"

Benvenuto nel magico mondo degli encoding. Il problema si limita a questo,
non dipende da sqlite.


> Come posso ovviare il problema?

1. devi *sapere* quale è l'encoding originale di row[i]. Se non lo sai,
hai poche speranze di fare qualunque cosa (leggi
<http://www.joelonsoftware.com/articles/Unicode.html> per una rapida
introduzione)
2. se row[i] è una stringa (oggetto 'str') e se l'encoding è latin1, puoi
usare "row[i] = row[i].decode('latin1')"
3. se l'encoding è "quasi sempre latin1", ovvero ti aspetti che a monte
abbiano fatto degli errori, puoi usare:

 row[i].decode('latin1', 'replace')

così almeno se in input viene passato un carattere illegale in output
viene sostituito da "?" invece che tirare un'eccezione.

4. latin1, latin9, cp1252 sono orrendamente simili: non credere di sapere
quale sia il tuo encoding finché non hai visto un carattere euro; nel
frattempo meglio usare la ricetta in 3.

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


Maggiori informazioni sulla lista Python