Olá,

o Python realmente é mais "exigente" no tratamento de strings que em 
outras linguagens, mas isso ocorre por que ele as trata da forma mais 
correta, e por conseqüência se "apanha" um pouco para aprender como 
funciona por tentativa e erro. O melhor é procurar uma explicação 
detalhada sobre codificação de caracteres com Python (vi algumas pela 
internet), mas vou dar uma super resumida para iniciantes:

ascii: representação de caracteres com apenas 7 bits, não tem caracteres 
com acentos
latin-1 (iso-8859-1): representação com 8 bits, ascii + caracteres com 
acentos, 'ç', etc.
utf-8: representação com número variável de bits, qualquer caracter 
unicode pode ser representado em utf-8

unicode: formato de tratamento de strings em memória, para ser salva tem 
que ser convertida para uma das representações acima.

Em Python, quando tu declara uma string com a syntaxe u'Minha string', 
tu estás na verdade criando um objeto do tipo 'unicode'. Quando usa a 
syntaxe convencional 'Minha string', o interpretador não tem como saber 
em qual conjunto de caracteres ela está representada, e por padrão ele 
assume que seja 'ascii'.

Por exemplo, se digitar o seguinte em um console Python:

u'%s' % 'á'

o interpretador tentaria criar uma string unicode formatada a partir de 
uma string unicode de parâmetro. Como o que foi passado de parâmetro foi 
uma string normal, ela deve ser convertida para unicode primeiro, mas ao 
fazer a conversão o interpretador assume que ela está em ascii, mas 
ascii não tem caracteres com acento, e portanto uma excessão é gerada.

Tu chegaste a mencionar que quando o username estava vazio dava erro, 
isso é por que tu não podes construir um objeto unicode a partir de algo 
diferente de uma string (como é o caso do None que provavelmente ele 
estava recebendo no teu código).

Aqui tem algumas informações sobre encodings interessantes:
http://www.slideshare.net/codebits/unicode-poetry-167368

[]'s

Daniel

-- 
Daniel Monteiro Basso
Líder Técnico do Centro de Inovação
Trino Pólo - Pólo de Informática de Caxias do Sul
http://www.trinopolo.com.br

Responder a