Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Fique ninja na codificação de caracteres

Fique ninja na codificação de caracteres

…Ou muito do que você devia saber sobre encoding e tinha vergonha de perguntar!

Apresentada no PGDay Ijuí 2016.

Sebastian Webber

October 13, 2016
Tweet

More Decks by Sebastian Webber

Other Decks in Programming

Transcript

  1. View Slide

  2. Sebastian
    Webber
    u Consultor na area de TI
    u Instrutor de banco de dados
    u metido a Chef
    u [aprendiz de] Ninja

    View Slide

  3. Ninjas de verdade… ok?

    View Slide

  4. Afinal o que é encoding?
    u Uma codificação de caracteres é um padrão de
    relacionamento entre um conjunto de caracteres com um
    conjunto de outra coisa, como por exemplo números ou
    pulsos elétricos com o objetivo de facilitar o
    armazenamento de texto em computadores...
    u …Ou uma forma de representar letras, números ou
    simbulos através de numeros ou outros artificios.

    View Slide

  5. Por exemplo…
    u Código Morse
    u Tabela ASCII

    View Slide

  6. View Slide

  7. s/charset/
    encoding/g

    View Slide

  8. No começo…
    u Letras e simbolos eram salvos em 7 BITS e isso permitia que todo o alfabeto e
    simbolos comuns fossem representados através de códigos númericos… Estava
    tudo certo pra quem falava inglês.
    u Aí o resto do mundo passou a comprar IBM PC fora da américa e pra cada
    região, caracteres diferentes da lingua inglesa eram tratadas no 8º BIT
    u Code Pages foram criados para definir o escopo de cada lingua. Na pratica
    todo e qualquer abaixo de 127 era igual, mas as diferenças eram tradadas
    acima dele.
    u Linguas asiaticas precisaram mais de 1 byte para a representação de seus
    ideogramas ou simbolos especificos

    View Slide

  9. View Slide

  10. Codificações ou Code Pages
    u A ISO padronizou code pages de
    acordo com a região e lingua mas a
    danada da Microsoft criou a sua
    versão dos encodings para o ambiente
    Windows.
    u Isso quer dizer que encondings como
    LATIN1 (ISO 8859-1) e LATIN-9(ISO
    8859-15) são equivalentes ao
    WIN1251.

    View Slide

  11. https://en.wikipedia.org/wiki/List_of_Unicode_characters

    View Slide

  12. Universal Character Set
    u A fim de acabar com essa confusão e
    multiplos padrões foi criado o Unicode
    u Ele é representado por 3 encodings:
    u UTF-8
    u UTF-16
    u UTF-32

    View Slide

  13. View Slide

  14. UTF-n
    Número de bits
    Total Bits
    UTF-8 8..32
    UTF-16 16..32
    UTF-32 32

    View Slide

  15. http://www.unicode.org/charts/nameslist/index.html

    View Slide

  16. View Slide

  17. View Slide

  18. Mas o tar do
    BOM?
    http://piadafacil.com.br/piadas-de-caipira

    View Slide

  19. Byte Order Mark – B.O.M.
    uMarca pra identificar (EF BB BF) o
    arquivo como unicode
    uNão recomendado pra UTF-8
    http://www.unicode.org/versions/Unicode9.0.0/ch03.pdf
    http://unicode.org/faq/utf_bom.html#bom1

    View Slide

  20. Problemas comuns de
    codificação…
    u Email, é claro!
    u Páginas da WEB que não utilizam UTF-8
    u A sua aplicação!

    View Slide

  21. Como resolver?
    u Utilize UTF-8!
    u Se utf-8 ainda não tiver os
    caracteres necessários pra
    sua aplicação, avalie o UTF-
    16 ou UTF-32
    u http://utf8everywhere.org

    View Slide

  22. Por que devo migrar pra UTF-8?
    u Por que usar um encoding universal é muito mais fácil
    u Por que é um jeito fácil de não esquentar mais a cabeça com encoding
    u Por que você já usa e não sabe (seu SO deve estar usando).
    u E por que você não quer mais erros como esse na sua aplicação:

    View Slide

  23. Mas.. Tem alguém usando?
    https://en.wikipedia.org/wiki/UTF-8

    View Slide

  24. E… por quê
    sim!

    View Slide

  25. O tema não era…

    View Slide

  26. https://wiki.postgresql.org/wiki/Identity_Guidelines

    View Slide

  27. WIN1251
    WIN1252 WIN1254
    WIN1255
    WIN1253
    WIN 1250
    WIN1256
    WIN1257
    WIN1258
    UTF-8
    WIN874
    WIN866
    UHC
    SQL_ASCII
    SHIFT_JIS_2004
    SJIS
    MULE_INTERNAL
    LATIN10
    LATIN9
    LATIN8
    LATIN7
    LATIN6
    LATIN5
    LATIN4
    LATIN3
    LATIN2
    LATIN1
    KOI8U
    KOI8R
    JOHAB
    ISO_8859_7
    ISO_8859_8
    ISO_8859_6
    EUC_KR
    EUC_TW
    GB18030
    EUC_JIS_2004
    GBK
    ISO_8859_5
    EUC_JP
    BIG5
    EUC_CN

    View Slide

  28. WIN1251
    WIN1252 WIN1254
    WIN1255
    WIN1253
    WIN 1250
    WIN1256
    WIN1257
    WIN1258
    UTF-8
    WIN874
    WIN866
    UHC
    SQL_ASCII
    SHIFT_JIS_2004
    SJIS
    MULE_INTERNAL
    LATIN10
    LATIN9
    LATIN8
    LATIN7
    LATIN6
    LATIN5
    LATIN4
    LATIN3
    LATIN2
    LATIN1
    KOI8U
    KOI8R
    JOHAB
    ISO_8859_7
    ISO_8859_8
    ISO_8859_6
    EUC_KR
    EUC_TW
    GB18030
    EUC_JIS_2004
    GBK
    ISO_8859_5
    EUC_JP
    BIG5
    EUC_CN

    View Slide

  29. Aonde e como eu
    configuro o encoding?
    u Pra definir o default, é necessário fazer isso via initdb
    u Na criação da database. Seja no createdb:
    u ..Ou no CREATE DATABASE:
    initdb -E EUC_JP
    createdb -E EUC_KR -T template0 korean_db
    CREATE DATABASE korean_db WITH ENCODING
    'EUC_KR' TEMPLATE 'template0';

    View Slide

  30. View Slide

  31. Locale
    u O Suporte ao locale respeita as preferencias culturais como alfabetos,
    ordenação, formatação numerica, etc.
    u O PostgreSQL usa o padrão ISO C e POSIX do sistema operacional
    u O suporte a locales é automaticamente na inicialização do cluster (criado
    apartir do initdb)

    View Slide

  32. Locale
    u As configurações de locale influenciam nos seguintes
    recursos SQL:
    u Ordem de ordenação de caracteres utilizando a clausula ORDER
    BY ou a comparação de operações em campos do tipo texto (text,
    varchar, etc).
    u Nas funções UPPER, LOWER e INITCAP
    u Operadores de comparação de padrões (LIKE, SIMILAR TO e
    expressões regulares POSIX)
    u As funções to_char
    u A possibilidade de utilizar indexes com o operador LIKE

    View Slide

  33. Locale
    u Ocasionalmente é util combinar varios locales, por exemplo, utilizar regras de
    collate em inglês (en_US) e exibir mensagens em espanhol (es_AR).
    u Para permitir esse tipo de combinação de vários locales, as variaveis abaixo
    permitem a configuração específica:
    LC_COLLATE Ordenação de caracteres
    LC_CTYPE
    Classificação de caracteres (o que é uma letra? É
    equivalente a uma letra maiuscula?)
    LC_MESSAGES Linguagem para exibir as mesas do servidor
    LC_MONETARY Exibição de moedas
    LC_NUMERIC Exibição de números
    LC_TIME Exibição de datas e horários

    View Slide

  34. u Permite especificar o locale de ordenação (LC_COLLATE) e classificações de
    caracteres (LC_CTYPE) a nível de colunas ou por operação.
    u Isso facilita a sua vida por permite que você utilizar um locale diferente do
    criado no banco de dados.
    Collation

    View Slide

  35. View Slide

  36. View Slide

  37. One more thing…

    View Slide

  38. View Slide

  39. View Slide

  40. View Slide

  41. Referências
    u http://local.joelonsoftware.com/wiki/O_M%C3%ADnimo_Absoluto_Que_Todo_
    Desenvolvedor_De_Software_Absolutamente,_Positivamente_Precisa_Saber_S
    obre_Unicode_E_Conjuntos_de_Caracteres_(Sem_Desculpas!)
    u http://www.i18nguy.com/unicode/codepages.html#msftdos
    u http://www.i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html
    u https://annevankesteren.nl/2009/09/utf-8-reasons
    u http://htmlpurifier.org/docs/enduser-utf8.html
    u http://www.postgresql.org/docs/current/static/multibyte.html

    View Slide

  42. View Slide