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.

Avatar for Sebastian Webber

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
  2. 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.
  3. 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
  4. 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.
  5. 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
  6. 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
  7. Problemas comuns de codificação… u Email, é claro! u Páginas

    da WEB que não utilizam UTF-8 u A sua aplicação!
  8. 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
  9. 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:
  10. 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
  11. 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
  12. 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';
  13. 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)
  14. 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
  15. 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
  16. 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