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