O documento discute encodings de caracteres e o Unicode. Brevemente descreve o ASCII e outros encodings comuns, como ISO-8859-1. Explica que o Unicode representa quase 100.000 caracteres e define formas de processar texto multilingue. Também apresenta UTF-8 como um formato que mapeia caracteres Unicode para sequências de bytes.
Mashing up the Web, Games, Music, Movies, Money and The Laws Of Physics in Se...
Unicode poetry
1. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Unicode no mundo real
Normaliza¸˜o do conte´do na WEB
ca u
Cl´udio Valente
a
SAPO
13 de Novembro de 2007
2. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Conte´dos
u
Introdu¸˜o
ca
1
Encodings mais comuns
2
Rela¸˜es
co
Unicode
3
Exemplos de codifica¸˜es
co
4
Utiliza¸˜o pr´tica
ca a
5
Problemas
C´digo exemplificativo
o
6
Conven¸˜es
co
Encoding amb´ ıguo em pedidos
V´rios encodings no mesmo documento
a
Conclus˜es
o
7
Objec¸˜es ao Unicode
co
Resumo
3. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Conceitos Fundamentais
Humanos comunicam com s´
ımbolos (letras e ideogr´ficos)
a
Computadores n˜o tˆm a no¸˜o de s´
ae ca ımbolo, apenas n´meros
u
Para processar texto num computador ´ necess´rio
e a
transformar caracteres em n´meros
u
Um encoding consiste na atribui¸˜o de um n´mero a cada
ca u
caracter pertencente a um conjunto
4. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Conceitos Fundamentais
Humanos comunicam com s´
ımbolos (letras e ideogr´ficos)
a
Computadores n˜o tˆm a no¸˜o de s´
ae ca ımbolo, apenas n´meros
u
Para processar texto num computador ´ necess´rio
e a
transformar caracteres em n´meros
u
Um encoding consiste na atribui¸˜o de um n´mero a cada
ca u
caracter pertencente a um conjunto
5. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
ASCII
O encoding mais conhecido e usado na pr´tica ´ o ASCII
a e
(American Standard Code for Information Interchange)
Caracteres n˜o acentuados da Europa Ocidental e do Norte
a
Associa a cada caracter um n´mero entre 0 e 127
u
Cada caracter ASCII pode ser representado por um byte
Na realidade apenas s˜o necess´rios 7 bits
a a
Exemplo, o caracter A ´ representado pelo n´mero
e u
4116 = 6510 = 010000012
6. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
ASCII
O encoding mais conhecido e usado na pr´tica ´ o ASCII
a e
(American Standard Code for Information Interchange)
Caracteres n˜o acentuados da Europa Ocidental e do Norte
a
Associa a cada caracter um n´mero entre 0 e 127
u
Cada caracter ASCII pode ser representado por um byte
Na realidade apenas s˜o necess´rios 7 bits
a a
Exemplo, o caracter A ´ representado pelo n´mero
e u
4116 = 6510 = 010000012
7. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Encodings utilizados em Portuguˆs
e
L´
ıngua Portuguesa utiliza caracteres acentuados
ASCII ´ insuficiente
e
Os encodings mais utilizados em Portuguˆs s˜o:
ea
ISO-8859-1 (latin-1)
ISO-8859-15
Windows-1252
UTF-8
UTF-16
8. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Encodings utilizados em Portuguˆs
e
L´
ıngua Portuguesa utiliza caracteres acentuados
ASCII ´ insuficiente
e
Os encodings mais utilizados em Portuguˆs s˜o:
ea
ISO-8859-1 (latin-1)
ISO-8859-15
Windows-1252
UTF-8
UTF-16
9. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Rela¸˜es entre Encodings
co
ASCII
10. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Rela¸˜es entre Encodings
co
`´˜¸
aaac
ASCII ISO-8859-1
Extens˜o m´
a ınima com caracteres acentuados das l´
ınguas
latinas
11. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Rela¸˜es entre Encodings
co
ISO-8859-15
e
`´˜¸
aaac
ASCII ISO-8859-1
e
Windows-1252
ımbolo e n˜o faz parte do latin-1 e para o incluir foram
O s´ a
criadas v´rias extens˜es incompat´
a o ıveis
12. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Rela¸˜es entre Encodings
co
ISO-8859-15
e
tudo(?)
`´˜¸
aaac
ASCII ISO-8859-1 Unicode
UTF-(8-16-32)
e
Windows-1252
O Unicode ´ suposto conter todos os caracteres considerados
e
em l´
ınguas usadas actualmente bem como muitas j´ mortas.
a
13. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
O que ´ o Unicode
e
Representa conte´do escrito em (quase) qualquer sistema
u
humano que exista
A cada caracter (grifo) associa um valor num´rico
e
Define formas de processar dados tais como:
Classes de caracteres (alfa-num´ricos, pontua¸˜o, s´
e ca ımbolos)
Compara¸˜es entre caracteres (ordena¸˜o alfab´tica)
co ca e
Direccionalidade do texto
14. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
O que ´ o Unicode
e
Representa conte´do escrito em (quase) qualquer sistema
u
humano que exista
A cada caracter (grifo) associa um valor num´rico
e
Define formas de processar dados tais como:
Classes de caracteres (alfa-num´ricos, pontua¸˜o, s´
e ca ımbolos)
Compara¸˜es entre caracteres (ordena¸˜o alfab´tica)
co ca e
Direccionalidade do texto
15. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Caracter´
ısticas t´cnicas do Unicode
e
Define aproximadamente 100 000 caracteres
´
E uma extens˜o do latin-1.
a
Todos os caracteres portugueses tˆm a mesma representa¸˜o
e ca
em unicode
N˜o ´ poss´ continuar a representar cada caracter por um
ae ıvel
byte
´
E necess´rio fazer corresponder caracteres unicode a uma
a
sequˆncia de bytes
e
UTF-32
UTF-16
UTF-8
UTF-7
16. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Caracter´
ısticas t´cnicas do Unicode
e
Define aproximadamente 100 000 caracteres
´
E uma extens˜o do latin-1.
a
Todos os caracteres portugueses tˆm a mesma representa¸˜o
e ca
em unicode
N˜o ´ poss´ continuar a representar cada caracter por um
ae ıvel
byte
´
E necess´rio fazer corresponder caracteres unicode a uma
a
sequˆncia de bytes
e
UTF-32
UTF-16
UTF-8
UTF-7
17. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Caracter´
ısticas t´cnicas do Unicode
e
Define aproximadamente 100 000 caracteres
´
E uma extens˜o do latin-1.
a
Todos os caracteres portugueses tˆm a mesma representa¸˜o
e ca
em unicode
N˜o ´ poss´ continuar a representar cada caracter por um
ae ıvel
byte
´
E necess´rio fazer corresponder caracteres unicode a uma
a
sequˆncia de bytes
e
UTF-32
UTF-16
UTF-8
UTF-7
18. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
UTF-8
UTF = Unicode Transformation Format
Faz corresponder a uma sequˆncia de caracteres unicode uma
e
sequˆncia de bytes
e
Vantagens
Conte´do ASCII fica inalterado
u
Independente de ordena¸˜o de bytes (little-endian vs
ca
big-endian)
Codifica todos os caracteres Unicode
Desvantagens
Podem ser necess´rios v´rios bytes por caracter
a a
N˜o ´ 7bit safe
ae
O acesso aleat´rio a um caracter n˜o ´ poss´
o ae ıvel
19. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
UTF-8
UTF = Unicode Transformation Format
Faz corresponder a uma sequˆncia de caracteres unicode uma
e
sequˆncia de bytes
e
Vantagens
Conte´do ASCII fica inalterado
u
Independente de ordena¸˜o de bytes (little-endian vs
ca
big-endian)
Codifica todos os caracteres Unicode
Desvantagens
Podem ser necess´rios v´rios bytes por caracter
a a
N˜o ´ 7bit safe
ae
O acesso aleat´rio a um caracter n˜o ´ poss´
o ae ıvel
20. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
UTF-8
UTF = Unicode Transformation Format
Faz corresponder a uma sequˆncia de caracteres unicode uma
e
sequˆncia de bytes
e
Vantagens
Conte´do ASCII fica inalterado
u
Independente de ordena¸˜o de bytes (little-endian vs
ca
big-endian)
Codifica todos os caracteres Unicode
Desvantagens
Podem ser necess´rios v´rios bytes por caracter
a a
N˜o ´ 7bit safe
ae
O acesso aleat´rio a um caracter n˜o ´ poss´
o ae ıvel
21. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
ıticos e e
alfabeto latino com diacr´
e
˜
A A C
¸
ASCII 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 n˜o suporta acentos nem e
a
22. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
ıticos e e
alfabeto latino com diacr´
e
˜
A A C
¸
ASCII 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 n˜o o e
a
23. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
ıticos e e
alfabeto latino com diacr´
e
˜
A A C
¸
ASCII 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 n˜o o e
a
24. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
ıticos e e
alfabeto latino com diacr´
e
˜
A A C
¸
ASCII 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 forma
incompat´
ıvel
25. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
ıticos e e
alfabeto latino com diacr´
e
˜
A A C
¸
ASCII 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 ´ extens˜o do ISO-8859-1
e a
26. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
ıticos e e
alfabeto latino com diacr´
e
˜
A A C
¸
ASCII 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 n´mero vari´vel de bytes
u a
27. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
ıticos e e
alfabeto latino com diacr´
e
˜
A A C
¸
ASCII 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
28. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
s´
ımbolos comuns
1
œ “ ...
2
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 n˜o ´ estritamente uma extens˜o de ISO-8859-1
ae a
29. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
s´
ımbolos comuns
1
œ “ ...
2
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 reticˆncias definidas no Windows-1252 mas
e
n˜o no ISO-8859-1(5)
a
30. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Exemplos de codifica¸˜es
co
s´
ımbolos comuns
1
œ “ ...
2
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 pr´ticos)
a
31. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
HTML
Identificar o conte´do da p´gina como estando codificado em
u a
UTF-8 nos cabe¸alhos de HTTP.
c
Content-Type: text/html; charset=utf-8
Identificar no documento.
<head>
<meta http-equiv=quot;content-typequot; content=quot;text/html;
charset=utf-8quot; />
</head>
Forms.
O encoding deve ser especificado sendo o da p´gina por
a
omiss˜o
a
<form accept-charset=quot;UTF-8quot;>
...
</form>
32. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
HTML
Identificar o conte´do da p´gina como estando codificado em
u a
UTF-8 nos cabe¸alhos de HTTP.
c
Content-Type: text/html; charset=utf-8
Identificar no documento.
<head>
<meta http-equiv=quot;content-typequot; content=quot;text/html;
charset=utf-8quot; />
</head>
Forms.
O encoding deve ser especificado sendo o da p´gina por
a
omiss˜o
a
<form accept-charset=quot;UTF-8quot;>
...
</form>
33. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
HTML
Identificar o conte´do da p´gina como estando codificado em
u a
UTF-8 nos cabe¸alhos de HTTP.
c
Content-Type: text/html; charset=utf-8
Identificar no documento.
<head>
<meta http-equiv=quot;content-typequot; content=quot;text/html;
charset=utf-8quot; />
</head>
Forms.
O encoding deve ser especificado sendo o da p´gina por
a
omiss˜o
a
<form accept-charset=quot;UTF-8quot;>
...
</form>
34. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Parˆmetros em Unicode
a
Quando um pedido GET ou POST ´ efectuado, os parˆmetros
e a
devem ser transformados (uri escape). Infelizmente o conte´do
u
associado aos bytes n˜o ´ transmitido no pedido obrigando a:
ae
For¸ar um determinado encoding (parˆmetro accept-charset
c a
no form)
Utilizar argumentos heur´
ısticos
Assumir que est´ em UTF-8
a
Caso n˜o seja um conjunto de caracteres v´lido assumir latin-1
a a
ou melhor Windows-1252
Come¸a a ser comum enviar caracteres fora do ASCII como
c
%uXXXX onde os quatro X representam o c´digo unicode em
o
hexadecimal
35. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Parˆmetros em Unicode
a
Quando um pedido GET ou POST ´ efectuado, os parˆmetros
e a
devem ser transformados (uri escape). Infelizmente o conte´do
u
associado aos bytes n˜o ´ transmitido no pedido obrigando a:
ae
For¸ar um determinado encoding (parˆmetro accept-charset
c a
no form)
Utilizar argumentos heur´
ısticos
Assumir que est´ em UTF-8
a
Caso n˜o seja um conjunto de caracteres v´lido assumir latin-1
a a
ou melhor Windows-1252
Come¸a a ser comum enviar caracteres fora do ASCII como
c
%uXXXX onde os quatro X representam o c´digo unicode em
o
hexadecimal
36. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Parˆmetros em Unicode
a
Quando um pedido GET ou POST ´ efectuado, os parˆmetros
e a
devem ser transformados (uri escape). Infelizmente o conte´do
u
associado aos bytes n˜o ´ transmitido no pedido obrigando a:
ae
For¸ar um determinado encoding (parˆmetro accept-charset
c a
no form)
Utilizar argumentos heur´
ısticos
Assumir que est´ em UTF-8
a
Caso n˜o seja um conjunto de caracteres v´lido assumir latin-1
a a
ou melhor Windows-1252
Come¸a a ser comum enviar caracteres fora do ASCII como
c
%uXXXX onde os quatro X representam o c´digo unicode em
o
hexadecimal
37. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Erros comuns
P´ginas sem qualquer informa¸˜o de encoding
a ca
Conte´do latin-1 misturado com UTF-8
u
GET ’http://some.domain.pt/’|
iconv -f utf-8 -t utf-8 >/dev/null
iconv: illegal input sequence at position 48123
Conte´do UTF-8 em p´ginas latin-1. P´gina que se identifica
u a a
como estando em latin-1 mas que cont´m por exemplo
e
˜
ClA¡udio (deveria ser Cl´udio).
a
38. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Erros comuns
P´ginas sem qualquer informa¸˜o de encoding
a ca
Conte´do latin-1 misturado com UTF-8
u
GET ’http://some.domain.pt/’|
iconv -f utf-8 -t utf-8 >/dev/null
iconv: illegal input sequence at position 48123
Conte´do UTF-8 em p´ginas latin-1. P´gina que se identifica
u a a
como estando em latin-1 mas que cont´m por exemplo
e
˜
ClA¡udio (deveria ser Cl´udio).
a
39. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Erros comuns
P´ginas sem qualquer informa¸˜o de encoding
a ca
Conte´do latin-1 misturado com UTF-8
u
GET ’http://some.domain.pt/’|
iconv -f utf-8 -t utf-8 >/dev/null
iconv: illegal input sequence at position 48123
Conte´do UTF-8 em p´ginas latin-1. P´gina que se identifica
u a a
como estando em latin-1 mas que cont´m por exemplo
e
˜
ClA¡udio (deveria ser Cl´udio).
a
40. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
C´digo m´
o ınimo
Uma string usual ´ apenas um conjunto de bytes
e
> s= ’ C l x e 1 u d i o ’
Para interpretarmos como caracteres temos de especificar o
encoding
> u1 = u n i c o d e ( ’ C l x e 1 u d i o ’ , ’ l a t i n −1 ’ )
Mas podemos fazer de forma equivalente
> u2 = u n i c o d e ( ’ C l xc3 x a 1 u d i o ’ , ’ u t f −8 ’ )
Ou dizer logo que se trata duma string unicode
> u3 = u ’ C l u 0 0 e 1 u d i o ’
u1, u2 e u3 representam a mesma sequˆncia de grifos.
e
> p r i n t u1==u2 and u2==u3
True
41. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
C´digo m´
o ınimo
Uma string usual ´ apenas um conjunto de bytes
e
> s= ’ C l x e 1 u d i o ’
Para interpretarmos como caracteres temos de especificar o
encoding
> u1 = u n i c o d e ( ’ C l x e 1 u d i o ’ , ’ l a t i n −1 ’ )
Mas podemos fazer de forma equivalente
> u2 = u n i c o d e ( ’ C l xc3 x a 1 u d i o ’ , ’ u t f −8 ’ )
Ou dizer logo que se trata duma string unicode
> u3 = u ’ C l u 0 0 e 1 u d i o ’
u1, u2 e u3 representam a mesma sequˆncia de grifos.
e
> p r i n t u1==u2 and u2==u3
True
42. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
C´digo m´
o ınimo
Uma string usual ´ apenas um conjunto de bytes
e
> s= ’ C l x e 1 u d i o ’
Para interpretarmos como caracteres temos de especificar o
encoding
> u1 = u n i c o d e ( ’ C l x e 1 u d i o ’ , ’ l a t i n −1 ’ )
Mas podemos fazer de forma equivalente
> u2 = u n i c o d e ( ’ C l xc3 x a 1 u d i o ’ , ’ u t f −8 ’ )
Ou dizer logo que se trata duma string unicode
> u3 = u ’ C l u 0 0 e 1 u d i o ’
u1, u2 e u3 representam a mesma sequˆncia de grifos.
e
> p r i n t u1==u2 and u2==u3
True
43. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
C´digo m´
o ınimo
Uma string usual ´ apenas um conjunto de bytes
e
> s= ’ C l x e 1 u d i o ’
Para interpretarmos como caracteres temos de especificar o
encoding
> u1 = u n i c o d e ( ’ C l x e 1 u d i o ’ , ’ l a t i n −1 ’ )
Mas podemos fazer de forma equivalente
> u2 = u n i c o d e ( ’ C l xc3 x a 1 u d i o ’ , ’ u t f −8 ’ )
Ou dizer logo que se trata duma string unicode
> u3 = u ’ C l u 0 0 e 1 u d i o ’
u1, u2 e u3 representam a mesma sequˆncia de grifos.
e
> p r i n t u1==u2 and u2==u3
True
44. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Argumentos em encoding amb´
ıguo
Supor que ’nome’ cont´m o valor de um argumento de um pedido
e
GET depois de url decoded. S´ sabemos uma sequˆncia de bytes
o e
mas o utilizador realmente pretendeu introduzir o nome ’Cl´udio’.
a
http://domain.pt/?q=Cl%E1udio
http://domain.pt/?q=Cl%C3%A1udio
> nome1 = ’ C l x e 1 u d i o ’
> nome2 = ’ C l xc3 x a 1 u d i o ’
Como detectar heuristicamente o que o utilizador pretende?
45. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Argumentos em encoding amb´
ıguo
Supor que ’nome’ cont´m o valor de um argumento de um pedido
e
GET depois de url decoded. S´ sabemos uma sequˆncia de bytes
o e
mas o utilizador realmente pretendeu introduzir o nome ’Cl´udio’.
a
http://domain.pt/?q=Cl%E1udio
http://domain.pt/?q=Cl%C3%A1udio
> nome1 = ’ C l x e 1 u d i o ’
> nome2 = ’ C l xc3 x a 1 u d i o ’
Como detectar heuristicamente o que o utilizador pretende?
46. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
”Resolu¸˜o”
ca
Definir a fun¸˜o:
ca
def c l e a n a r g s ( s ) :
try :
r e t u r n u n i c o d e ( s , ’ u t f −8 ’ )
except U n i c o d e D e c o d e E r r o r :
r e t u r n u n i c o d e ( s , ’ windows −1252 ’ )
O resultado destas fun¸˜o em ambas alternativas tem como
ca
resultado uma string unicode que representa realmente o nome
pretendido.
> c l e a n a r g s ( nome1 )
u ’ Cl xe1udio ’
> c l e a n a r g s ( nome2 )
u ’ Cl xe1udio ’
47. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
”Resolu¸˜o”
ca
Definir a fun¸˜o:
ca
def c l e a n a r g s ( s ) :
try :
r e t u r n u n i c o d e ( s , ’ u t f −8 ’ )
except U n i c o d e D e c o d e E r r o r :
r e t u r n u n i c o d e ( s , ’ windows −1252 ’ )
O resultado destas fun¸˜o em ambas alternativas tem como
ca
resultado uma string unicode que representa realmente o nome
pretendido.
> c l e a n a r g s ( nome1 )
u ’ Cl xe1udio ’
> c l e a n a r g s ( nome2 )
u ’ Cl xe1udio ’
48. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Como tratar conte´do com texto em v´rios encodings
u a
Bastantes p´ginas na Web em Portuguˆs tˆm conte´do
a ee u
identificado como estando em UTF-8, mas contendo
caracteres representados em windows-1252
Outras identificam-se como estando em latin-1 ou
windows-1252 mas contˆm palavras codificadas em UTF-8
e
Uma solu¸˜o de compromisso consiste em:
ca
Assumir que todo o conte´do est´ em UTF-8
u a
Quando um dado conjunto de bytes n˜o corresponder a
a
UTF-8 v´lido assumir que esses bytes representam caracteres
a
em windows-1252 ou latin-1
49. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Como tratar conte´do com texto em v´rios encodings
u a
Bastantes p´ginas na Web em Portuguˆs tˆm conte´do
a ee u
identificado como estando em UTF-8, mas contendo
caracteres representados em windows-1252
Outras identificam-se como estando em latin-1 ou
windows-1252 mas contˆm palavras codificadas em UTF-8
e
Uma solu¸˜o de compromisso consiste em:
ca
Assumir que todo o conte´do est´ em UTF-8
u a
Quando um dado conjunto de bytes n˜o corresponder a
a
UTF-8 v´lido assumir que esses bytes representam caracteres
a
em windows-1252 ou latin-1
50. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Implementa¸˜o
ca
import c o d e c s
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 = u n i c o d e ( s , ’ windows −1252 ’ )
r e t u r n ( r e t , ex . s t a r t +1)
codecs . r e g i s t e r e r r o r ( ’ clean ’ , h a n d l e e r r o r s )
Utilizar da seguinte forma:
> i n p u t = ’ C l x e 1 u d i o C l xc3 x a 1 u d i o ’
> u n i c o d e ( i n p u t , ’ u t f −8 ’ , ’ c l e a n ’ )
u ’ Cl xe1udio Cl xe1udio ’
> p r i n t u n i c o d e ( i n p u t , ’ u t f −8 ’ , ’ c l e a n ’ )
Cl´udio Cl´udio
a a
51. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Implementa¸˜o
ca
import c o d e c s
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 = u n i c o d e ( s , ’ windows −1252 ’ )
r e t u r n ( r e t , ex . s t a r t +1)
codecs . r e g i s t e r e r r o r ( ’ clean ’ , h a n d l e e r r o r s )
Utilizar da seguinte forma:
> i n p u t = ’ C l x e 1 u d i o C l xc3 x a 1 u d i o ’
> u n i c o d e ( i n p u t , ’ u t f −8 ’ , ’ c l e a n ’ )
u ’ Cl xe1udio Cl xe1udio ’
> p r i n t u n i c o d e ( i n p u t , ’ u t f −8 ’ , ’ c l e a n ’ )
Cl´udio Cl´udio
a a
52. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Isto ´ complicar sem necessidade
e
Basta trabalhar com bytes sempre em UTF-8
Esta abordagem n˜o funciona.
a
Como j´ vimos ’nome2’ representa o nome ’Cl´udio’ em UTF-8.
a a
Imaginemos que pretendemos imprimir este nome em mai´sculas.
u
> nome2 . u p p e r ( )
’ C l xc3 x a 1 u d i o ’
> p r i n t nome2 . u p p e r ( )
CL´UDIO
a
N˜o ´ o resultado pretendido.
ae
> c l e a n a r g s ( nome2 ) . u p p e r ( )
u ’ CLxc1UDIO ’
> p r i n t c l e a n a r g s ( nome2 ) . u p p e r ( )
´
CLAUDIO
53. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Isto ´ complicar sem necessidade
e
Basta trabalhar com bytes sempre em UTF-8
Esta abordagem n˜o funciona.
a
Como j´ vimos ’nome2’ representa o nome ’Cl´udio’ em UTF-8.
a a
Imaginemos que pretendemos imprimir este nome em mai´sculas.
u
> nome2 . u p p e r ( )
’ C l xc3 x a 1 u d i o ’
> p r i n t nome2 . u p p e r ( )
CL´UDIO
a
N˜o ´ o resultado pretendido.
ae
> c l e a n a r g s ( nome2 ) . u p p e r ( )
u ’ CLxc1UDIO ’
> p r i n t c l e a n a r g s ( nome2 ) . u p p e r ( )
´
CLAUDIO
54. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Resumo
sequˆncias de bytes n˜o determinam caracteres univocamente
e a
sempre que poss´ trabalhar com strings unicode e
ıvel
especificar o encoding de bytes em p´ginas WEB
a
a WEB est´ progressivamente a migrar para UTF-8
a
durante a transi¸˜o ´ publicado diverso tipo de conte´do com
ca e u
erros
o problema de interpretar o que se pretende transmitir vs o
que ´ realmente transmitido necessita de abordagens
e
heur´
ısticas
55. Introdu¸˜o Encodings mais comuns Unicode Exemplos de codifica¸˜es Utiliza¸˜o pr´tica C´digo exemplificativo Conclus˜es
ca co ca a o o
Referˆncias
e
Cons´rcio Unicode
o
http://www.unicode.org/
Joel on Software
Informa¸˜o m´
ca ınima que todo o programador deve saber
Characters and encodings
http://www.cs.tut.fi/ jkorpela/chars/index.html
56. Apˆndice
e
Python
Suporta Unicode ”out of the box”
Tipos distintos para strings unicode e arrays de bytes (str,
unicode)
Assume encodings por omiss˜o e converte bytes para strings
a
unicode
Suporte bem integrado com a maior parte dos m´dulos
o
57. Apˆndice
e
Perl
Suporta Unicode ”out of the box”(Encode, perluni)
Utiliza o mesmo tipo para arrays de bytes e strings unicode
Distin¸˜o feita implicitamente (bit marca strings unicode)
ca
Suporte no motor de regular expressions
Abordagem impl´ıcita resulta em comportamentos com
nuances por vezes pouco ´bvias
o
58. Apˆndice
e
JAVA e C#
Suporta Unicode ”out of the box”
Tipos distintos para strings unicode e arrays de bytes
Integra¸˜o total com todos os m´dulos
ca o
59. Apˆndice
e
PHP5
N˜o suporta unicode de forma integrada
a
N˜o existem strings unicode, apenas bytes
a
´ poss´ utilizar extens˜es (iconv, mbstring)
E ıvel o
Todo o processamento ´ feito obrigatoriamente utilizando
e
bytes, tipicamente UTF-8
Biblioteca insuficiente para processar strings ”multibyte”
60. Apˆndice
e
PHP6
Promete:
Integrar Unicode
Tipos distintos para strings unicode e arrays de bytes
binary
string (default encoding)
unicode
Permitir desligar suporte unicode (INI)
Integrar unicode na maior parte das fun¸˜es built-in
co