Unicode poetry

60
Introdu¸ ao Encodings mais comuns Unicode Exemplos de codifica¸ oes Utiliza¸ ao pr´ atica odigo exemplificativo Conclus˜ oes Unicode no mundo real Normaliza¸ ao do conte´ udo na WEB Cl´ audio Valente SAPO 13 de Novembro de 2007

description

Os bits e os bytes da problemática do character encoding e da normalização de conteúdos na Web.

Transcript of Unicode poetry

Page 1: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Unicode no mundo realNormalizacao do conteudo na WEB

Claudio Valente

SAPO

13 de Novembro de 2007

Page 2: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Conteudos

1 Introducao

2 Encodings mais comunsRelacoes

3 Unicode

4 Exemplos de codificacoes

5 Utilizacao praticaProblemas

6 Codigo exemplificativoConvencoesEncoding ambıguo em pedidosVarios encodings no mesmo documento

7 ConclusoesObjeccoes ao UnicodeResumo

Page 3: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Conceitos Fundamentais

Humanos comunicam com sımbolos (letras e ideograficos)

Computadores nao tem a nocao de sımbolo, apenas numeros

Para processar texto num computador e necessariotransformar caracteres em numeros

Um encoding consiste na atribuicao de um numero a cadacaracter pertencente a um conjunto

Page 4: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Conceitos Fundamentais

Humanos comunicam com sımbolos (letras e ideograficos)

Computadores nao tem a nocao de sımbolo, apenas numeros

Para processar texto num computador e necessariotransformar caracteres em numeros

Um encoding consiste na atribuicao de um numero a cadacaracter pertencente a um conjunto

Page 5: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

ASCII

O encoding mais conhecido e usado na pratica e o ASCII(American Standard Code for Information Interchange)

Caracteres nao acentuados da Europa Ocidental e do Norte

Associa a cada caracter um numero entre 0 e 127

Cada caracter ASCII pode ser representado por um byte

Na realidade apenas sao necessarios 7 bits

Exemplo, o caracter A e representado pelo numero4116 = 6510 = 010000012

Page 6: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

ASCII

O encoding mais conhecido e usado na pratica e o ASCII(American Standard Code for Information Interchange)

Caracteres nao acentuados da Europa Ocidental e do Norte

Associa a cada caracter um numero entre 0 e 127

Cada caracter ASCII pode ser representado por um byte

Na realidade apenas sao necessarios 7 bits

Exemplo, o caracter A e representado pelo numero4116 = 6510 = 010000012

Page 7: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Encodings utilizados em Portugues

Lıngua Portuguesa utiliza caracteres acentuados

ASCII e insuficiente

Os encodings mais utilizados em Portugues sao:

ISO-8859-1 (latin-1)ISO-8859-15Windows-1252UTF-8UTF-16

Page 8: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Encodings utilizados em Portugues

Lıngua Portuguesa utiliza caracteres acentuados

ASCII e insuficiente

Os encodings mais utilizados em Portugues sao:

ISO-8859-1 (latin-1)ISO-8859-15Windows-1252UTF-8UTF-16

Page 9: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Relacoes entre Encodings

ASCII

Page 10: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Relacoes entre Encodings

ASCII ISO-8859-1aaac

Extensao mınima com caracteres acentuados das lınguaslatinas

Page 11: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Relacoes entre Encodings

ASCII ISO-8859-1aaac

ISO-8859-15

Windows-1252

e

e

O sımbolo e nao faz parte do latin-1 e para o incluir foramcriadas varias extensoes incompatıveis

Page 12: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Relacoes entre Encodings

ASCII ISO-8859-1aaac

ISO-8859-15

Windows-1252

e

e

Unicodetudo(?)

UTF-(8-16-32)

O Unicode e suposto conter todos os caracteres consideradosem lınguas usadas actualmente bem como muitas ja mortas.

Page 13: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

O que e o Unicode

Representa conteudo escrito em (quase) qualquer sistemahumano que exista

A cada caracter (grifo) associa um valor numerico

Define formas de processar dados tais como:

Classes de caracteres (alfa-numericos, pontuacao, sımbolos)Comparacoes entre caracteres (ordenacao alfabetica)Direccionalidade do texto

Page 14: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

O que e o Unicode

Representa conteudo escrito em (quase) qualquer sistemahumano que exista

A cada caracter (grifo) associa um valor numerico

Define formas de processar dados tais como:

Classes de caracteres (alfa-numericos, pontuacao, sımbolos)Comparacoes entre caracteres (ordenacao alfabetica)Direccionalidade do texto

Page 15: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Caracterısticas tecnicas do Unicode

Define aproximadamente 100 000 caracteres

E uma extensao do latin-1.

Todos os caracteres portugueses tem a mesma representacaoem unicode

Nao e possıvel continuar a representar cada caracter por umbyte

E necessario fazer corresponder caracteres unicode a umasequencia de bytes

UTF-32UTF-16UTF-8UTF-7

Page 16: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Caracterısticas tecnicas do Unicode

Define aproximadamente 100 000 caracteres

E uma extensao do latin-1.

Todos os caracteres portugueses tem a mesma representacaoem unicode

Nao e possıvel continuar a representar cada caracter por umbyte

E necessario fazer corresponder caracteres unicode a umasequencia de bytes

UTF-32UTF-16UTF-8UTF-7

Page 17: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Caracterısticas tecnicas do Unicode

Define aproximadamente 100 000 caracteres

E uma extensao do latin-1.

Todos os caracteres portugueses tem a mesma representacaoem unicode

Nao e possıvel continuar a representar cada caracter por umbyte

E necessario fazer corresponder caracteres unicode a umasequencia de bytes

UTF-32UTF-16UTF-8UTF-7

Page 18: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

UTF-8

UTF = Unicode Transformation Format

Faz corresponder a uma sequencia de caracteres unicode umasequencia de bytes

Vantagens

Conteudo ASCII fica inalteradoIndependente de ordenacao de bytes (little-endian vsbig-endian)Codifica todos os caracteres Unicode

Desvantagens

Podem ser necessarios varios bytes por caracterNao e 7bit safeO acesso aleatorio a um caracter nao e possıvel

Page 19: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

UTF-8

UTF = Unicode Transformation Format

Faz corresponder a uma sequencia de caracteres unicode umasequencia de bytes

Vantagens

Conteudo ASCII fica inalteradoIndependente de ordenacao de bytes (little-endian vsbig-endian)Codifica todos os caracteres Unicode

Desvantagens

Podem ser necessarios varios bytes por caracterNao e 7bit safeO acesso aleatorio a um caracter nao e possıvel

Page 20: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

UTF-8

UTF = Unicode Transformation Format

Faz corresponder a uma sequencia de caracteres unicode umasequencia de bytes

Vantagens

Conteudo ASCII fica inalteradoIndependente de ordenacao de bytes (little-endian vsbig-endian)Codifica todos os caracteres Unicode

Desvantagens

Podem ser necessarios varios bytes por caracterNao e 7bit safeO acesso aleatorio a um caracter nao e possıvel

Page 21: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoesalfabeto latino com diacrıticos e e

A A C eASCII A N.D. N.D. N.D.ISO-8859-1 A [C3] [C7] N.D.ISO-8859-15 A [C3] [C7] [A4]Windows-1252 A [C3] [C7] [80]UTF-8 A [C3][83] [C3][87] [E2][82][AC]UTF-16LE A[00] [C3][00] [C7][00] [AC][20]UTF-7 A +AMM- +AMc- +IKw-Unicode U+41 U+C3 U+C7 U+20AC

ASCII nao suporta acentos nem e

Page 22: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoesalfabeto latino com diacrıticos e e

A A C eASCII A N.D. N.D. N.D.ISO-8859-1 A [C3] [C7] N.D.ISO-8859-15 A [C3] [C7] [A4]Windows-1252 A [C3] [C7] [80]UTF-8 A [C3][83] [C3][87] [E2][82][AC]UTF-16LE A[00] [C3][00] [C7][00] [AC][20]UTF-7 A +AMM- +AMc- +IKw-Unicode U+41 U+C3 U+C7 U+20AC

ISO-8859-1 suporta acentos, mas nao o e

Page 23: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoesalfabeto latino com diacrıticos e e

A A C eASCII A N.D. N.D. N.D.ISO-8859-1 A [C3] [C7] N.D.ISO-8859-15 A [C3] [C7] [A4]Windows-1252 A [C3] [C7] [80]UTF-8 A [C3][83] [C3][87] [E2][82][AC]UTF-16LE A[00] [C3][00] [C7][00] [AC][20]UTF-7 A +AMM- +AMc- +IKw-Unicode U+41 U+C3 U+C7 U+20AC

ISO-8859-1 suporta acentos, mas nao o e

Page 24: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoesalfabeto latino com diacrıticos e e

A A C eASCII A N.D. N.D. N.D.ISO-8859-1 A [C3] [C7] N.D.ISO-8859-15 A [C3] [C7] [A4]Windows-1252 A [C3] [C7] [80]UTF-8 A [C3][83] [C3][87] [E2][82][AC]UTF-16LE A[00] [C3][00] [C7][00] [AC][20]UTF-7 A +AMM- +AMc- +IKw-Unicode U+41 U+C3 U+C7 U+20AC

ISO-8859-15 e Windows-1252 suportam e de formaincompatıvel

Page 25: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoesalfabeto latino com diacrıticos e e

A A C eASCII A N.D. N.D. N.D.ISO-8859-1 A [C3] [C7] N.D.ISO-8859-15 A [C3] [C7] [A4]Windows-1252 A [C3] [C7] [80]UTF-8 A [C3][83] [C3][87] [E2][82][AC]UTF-16LE A[00] [C3][00] [C7][00] [AC][20]UTF-7 A +AMM- +AMc- +IKw-Unicode U+41 U+C3 U+C7 U+20AC

O Unicode e extensao do ISO-8859-1

Page 26: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoesalfabeto latino com diacrıticos e e

A A C eASCII A N.D. N.D. N.D.ISO-8859-1 A [C3] [C7] N.D.ISO-8859-15 A [C3] [C7] [A4]Windows-1252 A [C3] [C7] [80]UTF-8 A [C3][83] [C3][87] [E2][82][AC]UTF-16LE A[00] [C3][00] [C7][00] [AC][20]UTF-7 A +AMM- +AMc- +IKw-Unicode U+41 U+C3 U+C7 U+20AC

UTF-8 necessita de um numero variavel de bytes

Page 27: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoesalfabeto latino com diacrıticos e e

A A C eASCII A N.D. N.D. N.D.ISO-8859-1 A [C3] [C7] N.D.ISO-8859-15 A [C3] [C7] [A4]Windows-1252 A [C3] [C7] [80]UTF-8 A [C3][83] [C3][87] [E2][82][AC]UTF-16LE A[00] [C3][00] [C7][00] [AC][20]UTF-7 A +AMM- +AMc- +IKw-Unicode U+41 U+C3 U+C7 U+20AC

UTF-16 e UTF-32 podem ser Little Endian ou Big Endian

Page 28: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoessımbolos comuns

12 œ “ . . .

ASCII N.D. N.D. N.D. N.D.ISO-8859-1 [BD] N.D. N.D. N.D.ISO-8859-15 N.D. [BD] N.D. N.D.Windows-1252 [BD] [9C] [93] [85]UTF-8 [C2][BD] [C5][93] [E2][80][9C] [E2][80][A6]UTF-16LE [BD][00] S[01] [1C][20] [26][20]UTF-7 +AL0- +AVM- +IBw- +ICY-Unicode U+BD U+153 U+201C U+2026

ISO-8859-15 nao e estritamente uma extensao de ISO-8859-1

Page 29: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoessımbolos comuns

12 œ “ . . .

ASCII N.D. N.D. N.D. N.D.ISO-8859-1 [BD] N.D. N.D. N.D.ISO-8859-15 N.D. [BD] N.D. N.D.Windows-1252 [BD] [9C] [93] [85]UTF-8 [C2][BD] [C5][93] [E2][80][9C] [E2][80][A6]UTF-16LE [BD][00] S[01] [1C][20] [26][20]UTF-7 +AL0- +AVM- +IBw- +ICY-Unicode U+BD U+153 U+201C U+2026

”smart quotes”e reticencias definidas no Windows-1252 masnao no ISO-8859-1(5)

Page 30: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Exemplos de codificacoessımbolos comuns

12 œ “ . . .

ASCII N.D. N.D. N.D. N.D.ISO-8859-1 [BD] N.D. N.D. N.D.ISO-8859-15 N.D. [BD] N.D. N.D.Windows-1252 [BD] [9C] [93] [85]UTF-8 [C2][BD] [C5][93] [E2][80][9C] [E2][80][A6]UTF-16LE [BD][00] S[01] [1C][20] [26][20]UTF-7 +AL0- +AVM- +IBw- +ICY-Unicode U+BD U+153 U+201C U+2026

Unicode codifica todos os caracteres (para efeitos praticos)

Page 31: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

HTML

Identificar o conteudo da pagina como estando codificado emUTF-8 nos cabecalhos de HTTP.

Content-Type: text/html; charset=utf-8

Identificar no documento.

<head><meta http-equiv="content-type" content="text/html;charset=utf-8" /></head>

Forms.O encoding deve ser especificado sendo o da pagina poromissao

<form accept-charset="UTF-8">...</form>

Page 32: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

HTML

Identificar o conteudo da pagina como estando codificado emUTF-8 nos cabecalhos de HTTP.

Content-Type: text/html; charset=utf-8

Identificar no documento.

<head><meta http-equiv="content-type" content="text/html;charset=utf-8" /></head>

Forms.O encoding deve ser especificado sendo o da pagina poromissao

<form accept-charset="UTF-8">...</form>

Page 33: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

HTML

Identificar o conteudo da pagina como estando codificado emUTF-8 nos cabecalhos de HTTP.

Content-Type: text/html; charset=utf-8

Identificar no documento.

<head><meta http-equiv="content-type" content="text/html;charset=utf-8" /></head>

Forms.O encoding deve ser especificado sendo o da pagina poromissao

<form accept-charset="UTF-8">...</form>

Page 34: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Parametros em Unicode

Quando um pedido GET ou POST e efectuado, os parametrosdevem ser transformados (uri escape). Infelizmente o conteudoassociado aos bytes nao e transmitido no pedido obrigando a:

Forcar um determinado encoding (parametro accept-charsetno form)

Utilizar argumentos heurısticos

Assumir que esta em UTF-8Caso nao seja um conjunto de caracteres valido assumir latin-1ou melhor Windows-1252

Comeca a ser comum enviar caracteres fora do ASCII como%uXXXX onde os quatro X representam o codigo unicode emhexadecimal

Page 35: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Parametros em Unicode

Quando um pedido GET ou POST e efectuado, os parametrosdevem ser transformados (uri escape). Infelizmente o conteudoassociado aos bytes nao e transmitido no pedido obrigando a:

Forcar um determinado encoding (parametro accept-charsetno form)

Utilizar argumentos heurısticos

Assumir que esta em UTF-8Caso nao seja um conjunto de caracteres valido assumir latin-1ou melhor Windows-1252

Comeca a ser comum enviar caracteres fora do ASCII como%uXXXX onde os quatro X representam o codigo unicode emhexadecimal

Page 36: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Parametros em Unicode

Quando um pedido GET ou POST e efectuado, os parametrosdevem ser transformados (uri escape). Infelizmente o conteudoassociado aos bytes nao e transmitido no pedido obrigando a:

Forcar um determinado encoding (parametro accept-charsetno form)

Utilizar argumentos heurısticos

Assumir que esta em UTF-8Caso nao seja um conjunto de caracteres valido assumir latin-1ou melhor Windows-1252

Comeca a ser comum enviar caracteres fora do ASCII como%uXXXX onde os quatro X representam o codigo unicode emhexadecimal

Page 37: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Erros comuns

Paginas sem qualquer informacao de encoding

Conteudo latin-1 misturado com UTF-8

GET ’http://some.domain.pt/’|iconv -f utf-8 -t utf-8 >/dev/nulliconv: illegal input sequence at position 48123

Conteudo UTF-8 em paginas latin-1. Pagina que se identificacomo estando em latin-1 mas que contem por exemploClA¡udio (deveria ser Claudio).

Page 38: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Erros comuns

Paginas sem qualquer informacao de encoding

Conteudo latin-1 misturado com UTF-8

GET ’http://some.domain.pt/’|iconv -f utf-8 -t utf-8 >/dev/nulliconv: illegal input sequence at position 48123

Conteudo UTF-8 em paginas latin-1. Pagina que se identificacomo estando em latin-1 mas que contem por exemploClA¡udio (deveria ser Claudio).

Page 39: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Erros comuns

Paginas sem qualquer informacao de encoding

Conteudo latin-1 misturado com UTF-8

GET ’http://some.domain.pt/’|iconv -f utf-8 -t utf-8 >/dev/nulliconv: illegal input sequence at position 48123

Conteudo UTF-8 em paginas latin-1. Pagina que se identificacomo estando em latin-1 mas que contem por exemploClA¡udio (deveria ser Claudio).

Page 40: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Codigo mınimo

Uma string usual e apenas um conjunto de bytes

> s=’ Cl \ xe1ud io ’

Para interpretarmos como caracteres temos de especificar oencoding

> u1 = un i code ( ’ Cl \ xe1ud io ’ , ’ l a t i n −1 ’ )

Mas podemos fazer de forma equivalente

> u2 = un i code ( ’ Cl \ xc3\ xa1ud io ’ , ’ u t f−8 ’ )

Ou dizer logo que se trata duma string unicode

> u3 = u ’ Cl \ u00e1ud io ’

u1, u2 e u3 representam a mesma sequencia de grifos.

> p r i n t u1==u2 and u2==u3True

Page 41: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Codigo mınimo

Uma string usual e apenas um conjunto de bytes

> s=’ Cl \ xe1ud io ’

Para interpretarmos como caracteres temos de especificar oencoding

> u1 = un i code ( ’ Cl \ xe1ud io ’ , ’ l a t i n −1 ’ )

Mas podemos fazer de forma equivalente

> u2 = un i code ( ’ Cl \ xc3\ xa1ud io ’ , ’ u t f−8 ’ )

Ou dizer logo que se trata duma string unicode

> u3 = u ’ Cl \ u00e1ud io ’

u1, u2 e u3 representam a mesma sequencia de grifos.

> p r i n t u1==u2 and u2==u3True

Page 42: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Codigo mınimo

Uma string usual e apenas um conjunto de bytes

> s=’ Cl \ xe1ud io ’

Para interpretarmos como caracteres temos de especificar oencoding

> u1 = un i code ( ’ Cl \ xe1ud io ’ , ’ l a t i n −1 ’ )

Mas podemos fazer de forma equivalente

> u2 = un i code ( ’ Cl \ xc3\ xa1ud io ’ , ’ u t f−8 ’ )

Ou dizer logo que se trata duma string unicode

> u3 = u ’ Cl \ u00e1ud io ’

u1, u2 e u3 representam a mesma sequencia de grifos.

> p r i n t u1==u2 and u2==u3True

Page 43: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Codigo mınimo

Uma string usual e apenas um conjunto de bytes

> s=’ Cl \ xe1ud io ’

Para interpretarmos como caracteres temos de especificar oencoding

> u1 = un i code ( ’ Cl \ xe1ud io ’ , ’ l a t i n −1 ’ )

Mas podemos fazer de forma equivalente

> u2 = un i code ( ’ Cl \ xc3\ xa1ud io ’ , ’ u t f−8 ’ )

Ou dizer logo que se trata duma string unicode

> u3 = u ’ Cl \ u00e1ud io ’

u1, u2 e u3 representam a mesma sequencia de grifos.

> p r i n t u1==u2 and u2==u3True

Page 44: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Argumentos em encoding ambıguo

Supor que ’nome’ contem o valor de um argumento de um pedidoGET depois de url decoded. So sabemos uma sequencia de bytesmas o utilizador realmente pretendeu introduzir o nome ’Claudio’.

http://domain.pt/?q=Cl%E1udio

http://domain.pt/?q=Cl%C3%A1udio

> nome1 = ’ Cl \ xe1ud io ’> nome2 = ’ Cl \ xc3\ xa1ud io ’

Como detectar heuristicamente o que o utilizador pretende?

Page 45: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Argumentos em encoding ambıguo

Supor que ’nome’ contem o valor de um argumento de um pedidoGET depois de url decoded. So sabemos uma sequencia de bytesmas o utilizador realmente pretendeu introduzir o nome ’Claudio’.

http://domain.pt/?q=Cl%E1udio

http://domain.pt/?q=Cl%C3%A1udio

> nome1 = ’ Cl \ xe1ud io ’> nome2 = ’ Cl \ xc3\ xa1ud io ’

Como detectar heuristicamente o que o utilizador pretende?

Page 46: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

”Resolucao”

Definir a funcao:

def c l e a n a r g s ( s ) :t ry :

return un i code ( s , ’ u t f−8 ’ )except UnicodeDecodeEr ro r :

return un i code ( s , ’ windows−1252 ’ )

O resultado destas funcao em ambas alternativas tem comoresultado uma string unicode que representa realmente o nomepretendido.

> c l e a n a r g s ( nome1 )u ’ Cl \ xe1ud io ’

> c l e a n a r g s ( nome2 )u ’ Cl \ xe1ud io ’

Page 47: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

”Resolucao”

Definir a funcao:

def c l e a n a r g s ( s ) :t ry :

return un i code ( s , ’ u t f−8 ’ )except UnicodeDecodeEr ro r :

return un i code ( s , ’ windows−1252 ’ )

O resultado destas funcao em ambas alternativas tem comoresultado uma string unicode que representa realmente o nomepretendido.

> c l e a n a r g s ( nome1 )u ’ Cl \ xe1ud io ’

> c l e a n a r g s ( nome2 )u ’ Cl \ xe1ud io ’

Page 48: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Como tratar conteudo com texto em varios encodings

Bastantes paginas na Web em Portugues tem conteudoidentificado como estando em UTF-8, mas contendocaracteres representados em windows-1252

Outras identificam-se como estando em latin-1 ouwindows-1252 mas contem palavras codificadas em UTF-8

Uma solucao de compromisso consiste em:

Assumir que todo o conteudo esta em UTF-8

Quando um dado conjunto de bytes nao corresponder aUTF-8 valido assumir que esses bytes representam caracteresem windows-1252 ou latin-1

Page 49: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Como tratar conteudo com texto em varios encodings

Bastantes paginas na Web em Portugues tem conteudoidentificado como estando em UTF-8, mas contendocaracteres representados em windows-1252

Outras identificam-se como estando em latin-1 ouwindows-1252 mas contem palavras codificadas em UTF-8

Uma solucao de compromisso consiste em:

Assumir que todo o conteudo esta em UTF-8

Quando um dado conjunto de bytes nao corresponder aUTF-8 valido assumir que esses bytes representam caracteresem windows-1252 ou latin-1

Page 50: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Implementacao

import codecs

def h a n d l e e r r o r s ( ex ) :s = ex . o b j e c t [ ex . s t a r t ]r e t = un i code ( s , ’ windows−1252 ’ )return ( r e t , ex . s t a r t +1)

codecs . r e g i s t e r e r r o r ( ’ c l e a n ’ , h a n d l e e r r o r s )

Utilizar da seguinte forma:

> i n pu t = ’ Cl \ xe1ud io Cl \ xc3\ xa1ud io ’> un i code ( input , ’ u t f−8 ’ , ’ c l e a n ’ )u ’ Cl \ xe1ud io Cl \ xe1ud io ’> p r i n t un i code ( input , ’ u t f−8 ’ , ’ c l e a n ’ )

Claudio Claudio

Page 51: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Implementacao

import codecs

def h a n d l e e r r o r s ( ex ) :s = ex . o b j e c t [ ex . s t a r t ]r e t = un i code ( s , ’ windows−1252 ’ )return ( r e t , ex . s t a r t +1)

codecs . r e g i s t e r e r r o r ( ’ c l e a n ’ , h a n d l e e r r o r s )

Utilizar da seguinte forma:

> i n pu t = ’ Cl \ xe1ud io Cl \ xc3\ xa1ud io ’> un i code ( input , ’ u t f−8 ’ , ’ c l e a n ’ )u ’ Cl \ xe1ud io Cl \ xe1ud io ’> p r i n t un i code ( input , ’ u t f−8 ’ , ’ c l e a n ’ )

Claudio Claudio

Page 52: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Isto e complicar sem necessidadeBasta trabalhar com bytes sempre em UTF-8

Esta abordagem nao funciona.Como ja vimos ’nome2’ representa o nome ’Claudio’ em UTF-8.Imaginemos que pretendemos imprimir este nome em maiusculas.

> nome2 . upper ( )’ Cl \ xc3\ xa1ud io ’

> p r i n t nome2 . upper ( )

CLaUDIO

Nao e o resultado pretendido.

> c l e a n a r g s ( nome2 ) . upper ( )u ’CL\xc1UDIO ’> p r i n t c l e a n a r g s ( nome2 ) . upper ( )

CLAUDIO

Page 53: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Isto e complicar sem necessidadeBasta trabalhar com bytes sempre em UTF-8

Esta abordagem nao funciona.Como ja vimos ’nome2’ representa o nome ’Claudio’ em UTF-8.Imaginemos que pretendemos imprimir este nome em maiusculas.

> nome2 . upper ( )’ Cl \ xc3\ xa1ud io ’

> p r i n t nome2 . upper ( )

CLaUDIO

Nao e o resultado pretendido.

> c l e a n a r g s ( nome2 ) . upper ( )u ’CL\xc1UDIO ’> p r i n t c l e a n a r g s ( nome2 ) . upper ( )

CLAUDIO

Page 54: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Resumo

sequencias de bytes nao determinam caracteres univocamente

sempre que possıvel trabalhar com strings unicode eespecificar o encoding de bytes em paginas WEB

a WEB esta progressivamente a migrar para UTF-8

durante a transicao e publicado diverso tipo de conteudo comerros

o problema de interpretar o que se pretende transmitir vs oque e realmente transmitido necessita de abordagensheurısticas

Page 55: Unicode poetry

Introducao Encodings mais comuns Unicode Exemplos de codificacoes Utilizacao pratica Codigo exemplificativo Conclusoes

Referencias

Consorcio Unicodehttp://www.unicode.org/

Joel on SoftwareInformacao mınima que todo o programador deve saber

Characters and encodingshttp://www.cs.tut.fi/ jkorpela/chars/index.html

Page 56: Unicode poetry

Apendice

Python

Suporta Unicode ”out of the box”

Tipos distintos para strings unicode e arrays de bytes (str,unicode)

Assume encodings por omissao e converte bytes para stringsunicode

Suporte bem integrado com a maior parte dos modulos

Page 57: Unicode poetry

Apendice

Perl

Suporta Unicode ”out of the box”(Encode, perluni)

Utiliza o mesmo tipo para arrays de bytes e strings unicode

Distincao feita implicitamente (bit marca strings unicode)

Suporte no motor de regular expressions

Abordagem implıcita resulta em comportamentos comnuances por vezes pouco obvias

Page 58: Unicode poetry

Apendice

JAVA e C#

Suporta Unicode ”out of the box”

Tipos distintos para strings unicode e arrays de bytes

Integracao total com todos os modulos

Page 59: Unicode poetry

Apendice

PHP5

Nao suporta unicode de forma integrada

Nao existem strings unicode, apenas bytes

E possıvel utilizar extensoes (iconv, mbstring)

Todo o processamento e feito obrigatoriamente utilizandobytes, tipicamente UTF-8

Biblioteca insuficiente para processar strings ”multibyte”

Page 60: Unicode poetry

Apendice

PHP6

Promete:

Integrar Unicode

Tipos distintos para strings unicode e arrays de bytes

binarystring (default encoding)unicode

Permitir desligar suporte unicode (INI)

Integrar unicode na maior parte das funcoes built-in