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.

6f3efd5477238ca18957c723854ec795?s=128

Sebastian Webber

October 13, 2016
Tweet

Transcript

  1. None
  2. Sebastian Webber u Consultor na area de TI u Instrutor

    de banco de dados u metido a Chef u [aprendiz de] Ninja
  3. Ninjas de verdade… ok?

  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.
  5. Por exemplo… u Código Morse u Tabela ASCII

  6. None
  7. s/charset/ encoding/g

  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
  9. None
  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.
  11. https://en.wikipedia.org/wiki/List_of_Unicode_characters

  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
  13. None
  14. UTF-n Número de bits Total Bits UTF-8 8..32 UTF-16 16..32

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

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

  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
  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!
  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
  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:
  23. Mas.. Tem alguém usando? https://en.wikipedia.org/wiki/UTF-8

  24. E… por quê sim!

  25. O tema não era…

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

  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
  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
  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';
  30. None
  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)
  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
  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
  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
  35. None
  36. None
  37. One more thing…

  38. None
  39. None
  40. None
  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
  42. None