Matando (ou quase)
Unicode(De|En)codeErrors
No Python 2
Para acabar (ou quase) com os
erros é necessário
compreender o funcionamento
Unicode: catálogo com
todos os símbolos criados
pela humanidade
Unicode é uma
abstração
código numérico
símbolo
Computadores são
reais e não abstratos,
então...
Codificação / Encoding
(UCS, UTF, ISO, ...)
unicode.encode("utf-8") str
str.decode("utf-8") unicode
"abstrato" "real"
Internamente Python
usa: UCS-2 ou 4
Unicode é complicado
Codificações são
complicadas
Python + Unicode +
Codificações = CHAOS
Adivinhar a codificação:
impossível
Técnicas para descobrir
• Tentativa e erro
• BOM
• Accept-Charset
• <form accept-charset="???">
• Mais algumas outras...
•...
Leitura Recomendada
• http://www.python.org.br/wiki/
TudoSobrePythoneUnicode
Upcoming SlideShare
Loading in …5
×

Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)

1,479 views
1,424 views

Published on

Published in: Technology
2 Comments
1 Like
Statistics
Notes
  • Não são intercambeáveis e não há conversão implícita, veja:
    >>> a = u'á'
    >>> b = 'é'
    >>> a + b
    Traceback (most recent call last):
    File '', line 1, in
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
    >>> c = 'i'
    >>> a + c
    u'\xe1i'
    >>> print a + b.decode('utf-8') # meu terminal usa utf-8
    áé

    Talvez os únicos três problemas que existam sejam:

    1. O caso onde eu fiz 'a+c' no exemplo acima não ter dado erro mesmo sendo possível concatenar as duas strings pelo fato da segunda não ter nenhum caracter especial.
    2. O tipo unicode implementar o método .decode().
    3. O tipo str implementar o método .encode() (poderia implementar um método .reencode(from_charset, to_charset)).

    Mas nunca pensei em excesso sobre esse assunto para ter absoluta certeza do que estou falando :D
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Um detalhe importante: o 'rolo' de Python com Unicode (Python2, pelo menos) é a quebra de uma própria regra do Python, que é não usar tipagem fraca, a la PHP ou Javascript. A maior fonte de erros inesperados no Python é causada por duplo encoding ou duplo decoding, o que não aconteceria se não houvesse conversão implícita.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
1,479
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
16
Comments
2
Likes
1
Embeds 0
No embeds

No notes for slide

Matando (ou quase) Unicode(De|En)codeErrors (lightning talk)

  1. 1. Matando (ou quase) Unicode(De|En)codeErrors No Python 2
  2. 2. Para acabar (ou quase) com os erros é necessário compreender o funcionamento
  3. 3. Unicode: catálogo com todos os símbolos criados pela humanidade
  4. 4. Unicode é uma abstração
  5. 5. código numérico símbolo
  6. 6. Computadores são reais e não abstratos, então...
  7. 7. Codificação / Encoding (UCS, UTF, ISO, ...)
  8. 8. unicode.encode("utf-8") str str.decode("utf-8") unicode "abstrato" "real" Internamente Python usa: UCS-2 ou 4
  9. 9. Unicode é complicado
  10. 10. Codificações são complicadas
  11. 11. Python + Unicode + Codificações = CHAOS
  12. 12. Adivinhar a codificação: impossível
  13. 13. Técnicas para descobrir • Tentativa e erro • BOM • Accept-Charset • <form accept-charset="???"> • Mais algumas outras... • Use mais de uma abordagem
  14. 14. Leitura Recomendada • http://www.python.org.br/wiki/ TudoSobrePythoneUnicode

×