fique ninja na codificação de caracteres

22
Fique ninja na codificação de caracteres …Ou muito do que você devia saber sobre encoding e tinha vergonha de perguntar Sebastian Webber

Upload: sebastian-webber

Post on 11-Apr-2017

485 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 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

Sebastian Webber

Page 2: Fique ninja na codificação de caracteres

Sebastian Webber

Consultor na area de TI com expertise em PostgreSQL, JBoss e AWS Instrutor de banco de dados Já desistiu da faculdade umas 3 vezes… Gosta muito de cozinhar Ninja desde 2015

Page 3: Fique ninja na codificação de caracteres

Afinal o que é encoding?

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

…Ou uma forma de representar letras, números ou simbulos através de numeros ou outros artificios.

Page 4: Fique ninja na codificação de caracteres

Exemplos

Código Morse Tabela ASCII

Page 5: Fique ninja na codificação de caracteres

No começo…

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.

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

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.

Linguas asiaticas precisaram mais de 1 byte para a representação de seus ideogramas ou simbolos especificos

Page 6: Fique ninja na codificação de caracteres
Page 7: Fique ninja na codificação de caracteres

Codificações ou Code Pages

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.

Isso quer dizer que encondings como LATIN1 (ISO 8859-1) e LATIN-9(ISO 8859-15) são equivalentes ao WIN1251.

Page 8: Fique ninja na codificação de caracteres

Universal Character Set

A fim de acabar com essa confusão e multiplos padrões foi criado o Unicode

Ele é representado por 3 encodings: UTF-8 UTF-16 UTF-32

Page 9: Fique ninja na codificação de caracteres

Problemas comuns de encoding

Email, é claro! Páginas da WEB que não utilizam UTF-8 A sua aplicação!

Page 10: Fique ninja na codificação de caracteres

Como resolver?

Utilize UTF-8! Se utf-8 ainda não tiver

os caracteres necessários pra sua aplicação, avalie o UTF-16 ou UTF-32

http://utf8everywhere.org

Page 11: Fique ninja na codificação de caracteres

Por que devo migrar pra UTF-8?

Por que usar um encoding universal é muito mais fácil Por que é um jeito fácil de não esquentar mais a cabeça com

encoding Por que você já usa e não sabe (seu SO deve estar usando). E por que você não quer mais erros como esse na sua aplicação:

Page 12: Fique ninja na codificação de caracteres

E quanto ao

Page 13: Fique ninja na codificação de caracteres

Quais encodings o PostgreSQL supporta? BIG5 EUC_CN EUC_JP EUC_JIS_2004 EUC_KR EUC_TW GB18030 GBK ISO_8859_5 ISO_8859_6

ISO_8859_7 ISO_8859_8 JOHAB KOI8R KOI8U LATIN1 LATIN2 LATIN3 LATIN4 LATIN5

LATIN6 LATIN7 LATIN8 LATIN9 LATIN10 MULE_INTERNAL SJIS SHIFT_JIS_2004 SQL_ASCII UHC UTF8

WIN866 WIN874 WIN1250 WIN1251 WIN1252 WIN1253 WIN1254 WIN1255 WIN1256 WIN1257 WIN1258

Sebastian Webber
Page 14: Fique ninja na codificação de caracteres

Aonde eu configuro o encoding?

Pra definir o default, é necessário fazer isso via initdb

Na criação da database. Seja no createdb:

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

Page 15: Fique ninja na codificação de caracteres

NÃO É POSSIVEL TROCAR O ENCODING

DEPOIS DE CRIAR O BANCO!

Page 16: Fique ninja na codificação de caracteres

Locale

O Suporte ao locale respeita as preferencias culturais como alfabetos, ordenação, formatação numerica, etc.

O PostgreSQL usa o padrão ISO C e POSIX do sistema operacional O suporte a locales é automaticamente na inicialização do cluster

(criado apartir do initdb)

Page 17: Fique ninja na codificação de caracteres

Locale

As configurações de locale influenciam nos seguintes recursos SQL: 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). Nas funções UPPER, LOWER e INITCAP Operadores de comparação de padrões (LIKE, SIMILAR TO e expressões

regulares POSIX) As funções to_char A possibilidade de utilizar indexes com o operador LIKE

Page 18: Fique ninja na codificação de caracteres

Locale

Ocasionalmente é util combinar varios locales, por exemplo, utilizar regras de collate em inglês (en_US) e exibir mensagens em espanhol (es_AR).

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 servidorLC_MONETARY Exibição de moedasLC_NUMERIC Exibição de númerosLC_TIME Exibição de datas e horários

Page 19: Fique ninja na codificação de caracteres

Collation

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.

Isso facilita a sua vida por permite que você utilizar um locale diferente do criado no banco de dados.

CREATE TABLE test1 (

a text COLLATE "de_DE",

b text COLLATE "es_ES",

...

);

SELECT a < (’foo’ COLLATE ‘fr_FR’) FROM test1;

SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";

Page 20: Fique ninja na codificação de caracteres

Como eu TROCO de um encoding pra outro? pg_dump e pg_restore Replicação lógica (casando o encoding de origem com de destino)

Page 21: Fique ninja na codificação de caracteres

Düv¡dç?

Page 22: Fique ninja na codificação de caracteres

Referências

http://local.joelonsoftware.com/wiki/O_M%C3%ADnimo_Absoluto_Que_Todo_Desenvolvedor_De_Software_Absolutamente,_Positivamente_Precisa_Saber_Sobre_Unicode_E_Conjuntos_de_Caracteres_(Sem_Desculpas!)

http://www.i18nguy.com/unicode/codepages.html#msftdos http://www.i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html https://annevankesteren.nl/2009/09/utf-8-reasons http://htmlpurifier.org/docs/enduser-utf8.html http://www.postgresql.org/docs/current/static/multibyte.html