Unicode poetry

Preview:

DESCRIPTION

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

Citation preview

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

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

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

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

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

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

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

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

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

Relacoes entre Encodings

ASCII

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

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)

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>

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>

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>

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

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

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

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

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

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

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

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

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

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

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?

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?

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 ’

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 ’

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

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

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

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

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

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

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

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

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

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

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

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”

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