Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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,602 views

Published on

Published in: Technology
  • 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

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

×