[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