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. Sebastian
    Webber
    u Consultor na area de TI
    u Instrutor de banco de dados
    u metido a Chef
    u [aprendiz de] Ninja

    View full-size slide

  2. Ninjas de verdade… ok?

    View full-size slide

  3. 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 full-size slide

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

    View full-size slide

  5. s/charset/
    encoding/g

    View full-size slide

  6. 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 full-size slide

  7. 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 full-size slide

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

    View full-size slide

  9. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  13. 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 full-size slide

  14. 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 full-size slide

  15. 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 full-size slide

  16. 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 full-size slide

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

    View full-size slide

  18. E… por quê
    sim!

    View full-size slide

  19. O tema não era…

    View full-size slide

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

    View full-size slide

  21. 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 full-size slide

  22. 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 full-size slide

  23. 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 full-size slide

  24. 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 full-size slide

  25. 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 full-size slide

  26. 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 full-size slide

  27. 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 full-size slide

  28. One more thing…

    View full-size slide

  29. 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 full-size slide