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
  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