Representación de la Información (III)

Anuncio
Representación de la Información (III)
Representación de Caracteres
Maximiliano Geier
10/04/2015
Maximiliano Geier
Representación de la Información (III)
10/04/2015
1 / 14
Representación de caracteres
Representación de caracteres
La memoria contiene bits, ceros y unos dispuestos en algún orden que
se pueden interpretar de diferentes formas.
Hasta ahora estuvimos viendo distintas maneras de representar
números.
¿Cómo hacemos para guardar en memoria la cadena de caracteres
icb2015?
Maximiliano Geier
Representación de la Información (III)
10/04/2015
2 / 14
Representación de caracteres
ASCII
Respuesta 1: ASCII (American Standard for Information Interchange – 1963)
Maximiliano Geier
Representación de la Información (III)
10/04/2015
3 / 14
Representación de caracteres
EBCDIC
Respuesta 1 bis: EBCDIC (Extended Binary Coded Decimal Interchange Code –
1963, IBM)
Maximiliano Geier
Representación de la Información (III)
10/04/2015
4 / 14
Representación de caracteres
EBCDIC
Respuesta 1 bis: EBCDIC (Extended Binary Coded Decimal Interchange Code –
1963, IBM)
Problema: ¿y si quiero representar la cadena de caracteres Marı́a Elena?
Maximiliano Geier
Representación de la Información (III)
10/04/2015
4 / 14
Representación de caracteres
ISO-8859-1 (Latin-1)
Respuesta 2: Latin-1
Maximiliano Geier
Representación de la Información (III)
10/04/2015
5 / 14
Representación de caracteres
ISO-8859-1 (Latin-1)
Respuesta 2: Latin-1
¿Y ahora si quiero codificar 你什么名字?
Maximiliano Geier
Representación de la Información (III)
10/04/2015
5 / 14
Representación de caracteres
Unicode
Para unificar la codificación de caracteres en todas las lenguas del
mundo se definió un standard, llamado Unicode, que establece una
numeración uniforme para 113.021 caracteres (versión 7.0, Junio
2014) en 123 scripts diferentes
Maximiliano Geier
Representación de la Información (III)
10/04/2015
6 / 14
Representación de caracteres
Unicode
Para unificar la codificación de caracteres en todas las lenguas del
mundo se definió un standard, llamado Unicode, que establece una
numeración uniforme para 113.021 caracteres (versión 7.0, Junio
2014) en 123 scripts diferentes
A esta lista de caracteres se la conoce como UCS (Universal
Character Set)
Maximiliano Geier
Representación de la Información (III)
10/04/2015
6 / 14
Representación de caracteres
Unicode
Para unificar la codificación de caracteres en todas las lenguas del
mundo se definió un standard, llamado Unicode, que establece una
numeración uniforme para 113.021 caracteres (versión 7.0, Junio
2014) en 123 scripts diferentes
A esta lista de caracteres se la conoce como UCS (Universal
Character Set)
Algunos scripts incluidos: Árabe, Armenio, Bengalı́, Bopomofo,
Cirı́lico, Devanagari, Georgiano, Griego, Gujarati, Gurmukhi, Hangul,
Hebreo, Hiragana, Kannada, Katakana, Lao, Latı́n, Malayo, Oriya,
Tamil, Telugu, Thai, Tibetano, CJK (chino, japonés y coreano),
Sánscrito védico, Javanés, Khmer, Mongol, Tibetano, Braille, Runas,
Klingon, etc.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
6 / 14
Representación de caracteres
Unicode
Para unificar la codificación de caracteres en todas las lenguas del
mundo se definió un standard, llamado Unicode, que establece una
numeración uniforme para 113.021 caracteres (versión 7.0, Junio
2014) en 123 scripts diferentes
A esta lista de caracteres se la conoce como UCS (Universal
Character Set)
Algunos scripts incluidos: Árabe, Armenio, Bengalı́, Bopomofo,
Cirı́lico, Devanagari, Georgiano, Griego, Gujarati, Gurmukhi, Hangul,
Hebreo, Hiragana, Kannada, Katakana, Lao, Latı́n, Malayo, Oriya,
Tamil, Telugu, Thai, Tibetano, CJK (chino, japonés y coreano),
Sánscrito védico, Javanés, Khmer, Mongol, Tibetano, Braille, Runas,
Klingon, etc.
Unicode establece el mapa de caracteres, pero no cómo se codifican.
¿Cómo hacemos?
Maximiliano Geier
Representación de la Información (III)
10/04/2015
6 / 14
Representación de caracteres
UCS y UTF
UCS define una manera de codificar los caracteres, utilizando el
número del mismo en el mapa. Para esto necesitamos al menos 17
bits (217 = 131072).
Las codificaciones de UCS son de longitud fija, se indica en el
nombre la cantidad de bytes de la codificación.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
7 / 14
Representación de caracteres
UCS y UTF
UCS define una manera de codificar los caracteres, utilizando el
número del mismo en el mapa. Para esto necesitamos al menos 17
bits (217 = 131072).
Las codificaciones de UCS son de longitud fija, se indica en el
nombre la cantidad de bytes de la codificación.
Inicialmente UCS-2, luego UCS-4.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
7 / 14
Representación de caracteres
UCS y UTF
UCS define una manera de codificar los caracteres, utilizando el
número del mismo en el mapa. Para esto necesitamos al menos 17
bits (217 = 131072).
Las codificaciones de UCS son de longitud fija, se indica en el
nombre la cantidad de bytes de la codificación.
Inicialmente UCS-2, luego UCS-4.
Problema: el texto “hola mundo” se codificarı́a en UCS-4 como:
00 00 00 68 | 00 00 00 6F | 00 00 00 6C | 00 00 00 61
00 00 00 20 | 00 00 00 6D | 00 00 00 75 | 00 00 00 6E
00 00 00 64 | 00 00 00 6F
Mientras que en ASCII la codificación es:
68 6F 6C 61 | 20 6D 75 6E | 64 6F
Maximiliano Geier
Representación de la Información (III)
10/04/2015
7 / 14
Representación de caracteres
UCS y UTF
UCS define una manera de codificar los caracteres, utilizando el
número del mismo en el mapa. Para esto necesitamos al menos 17
bits (217 = 131072).
Las codificaciones de UCS son de longitud fija, se indica en el
nombre la cantidad de bytes de la codificación.
Inicialmente UCS-2, luego UCS-4.
Problema: el texto “hola mundo” se codificarı́a en UCS-4 como:
00 00 00 68 | 00 00 00 6F | 00 00 00 6C | 00 00 00 61
00 00 00 20 | 00 00 00 6D | 00 00 00 75 | 00 00 00 6E
00 00 00 64 | 00 00 00 6F
Mientras que en ASCII la codificación es:
68 6F 6C 61 | 20 6D 75 6E | 64 6F
Solución: usar codificaciones de longitud variable
(UTF = UCS Transformation Format)
Maximiliano Geier
Representación de la Información (III)
10/04/2015
7 / 14
Representación de caracteres
UTF
UTF define diversos sistemas de transformación del código de un caracter
a su representación en memoria. Para indicar el tipo, se suele utilizar un
número que representa la cantidad de bits que tiene cada unidad de
código (code unit) del formato.
Los formatos UTF más utilizados son UTF-32, UTF-16 y UTF-8.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
8 / 14
Representación de caracteres
UTF
UTF define diversos sistemas de transformación del código de un caracter
a su representación en memoria. Para indicar el tipo, se suele utilizar un
número que representa la cantidad de bits que tiene cada unidad de
código (code unit) del formato.
Los formatos UTF más utilizados son UTF-32, UTF-16 y UTF-8.
UTF-32 equivalente a UCS-4.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
8 / 14
Representación de caracteres
UTF
UTF define diversos sistemas de transformación del código de un caracter
a su representación en memoria. Para indicar el tipo, se suele utilizar un
número que representa la cantidad de bits que tiene cada unidad de
código (code unit) del formato.
Los formatos UTF más utilizados son UTF-32, UTF-16 y UTF-8.
UTF-32 equivalente a UCS-4.
UTF-16 toma como base UCS-2, utiliza 2 code units de 16 bits para
codificar caracteres cuyo código tiene un valor superior a
U+10000.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
8 / 14
Representación de caracteres
UTF
UTF define diversos sistemas de transformación del código de un caracter
a su representación en memoria. Para indicar el tipo, se suele utilizar un
número que representa la cantidad de bits que tiene cada unidad de
código (code unit) del formato.
Los formatos UTF más utilizados son UTF-32, UTF-16 y UTF-8.
UTF-32 equivalente a UCS-4.
UTF-16 toma como base UCS-2, utiliza 2 code units de 16 bits para
codificar caracteres cuyo código tiene un valor superior a
U+10000.
UTF-8 toma como base ASCII, codificación de longitud variable
entre 1 y 4 code units de 8 bits.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
8 / 14
Representación de caracteres
Codificación en UTF-8
En UTF-8 se utiliza la siguiente tabla para codificar caracteres Unicode:
Bits
7
11
16
21
Inicio
U+0000
U+0080
U+0800
U+10000
Fin
U+007F
U+07FF
U+FFFF
U+10FFFF
Byte 1
0xxxxxxx
110xxxxx
1110xxxx
11110xxx
Byte 2
Byte 3
Byte 4
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
Vamos a codificar el texto 名字, que corresponde a los caracteres Unicode
U+540D U+5B571
1
http://www.fileformat.info/info/unicode/char/search.htm
Maximiliano Geier
Representación de la Información (III)
10/04/2015
9 / 14
Representación de caracteres
Codificación en UTF-8 (cont.)
Primero escribimos ambos números en binario:
540D = 0101 0100 0000 1101
5B57 = 0101 1011 0101 0111
Maximiliano Geier
Representación de la Información (III)
10/04/2015
10 / 14
Representación de caracteres
Codificación en UTF-8 (cont.)
Primero escribimos ambos números en binario:
540D = 0101 0100 0000 1101
5B57 = 0101 1011 0101 0111
Como ocupan 15 bits, tenemos que usar la codificación de 3 bytes. La
escribimos:
540D ⇒ 1110 0101 1001 0000 1000 1101 ⇒ E5 90 8D
5B57 ⇒ 1110 0101 1010 1101 1001 0111 ⇒ E5 AD 97
Maximiliano Geier
Representación de la Información (III)
10/04/2015
10 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
63, en binario 0110 0011 ⇒ U+0063
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
63, en binario 0110 0011 ⇒ U+0063
C3, en binario 1100 0011.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
63, en binario 0110 0011 ⇒ U+0063
C3, en binario 1100 0011. Tenemos que leer 1 byte más.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
63, en binario 0110 0011 ⇒ U+0063
C3, en binario 1100 0011. Tenemos que leer 1 byte más.
B6, en binario 1011 0110 ⇒ U+00F6
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
63, en binario 0110 0011 ⇒ U+0063
C3, en binario 1100 0011. Tenemos que leer 1 byte más.
B6, en binario 1011 0110 ⇒ U+00F6
E4, en binario 1110 0100. Tenemos que leer 2 bytes más.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
63, en binario 0110 0011 ⇒ U+0063
C3, en binario 1100 0011. Tenemos que leer 1 byte más.
B6, en binario 1011 0110 ⇒ U+00F6
E4, en binario 1110 0100. Tenemos que leer 2 bytes más.
BA 9C, en binario 1011 1010 1001 1100 ⇒ U+4E9C
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
63, en binario 0110 0011 ⇒ U+0063
C3, en binario 1100 0011. Tenemos que leer 1 byte más.
B6, en binario 1011 0110 ⇒ U+00F6
E4, en binario 1110 0100. Tenemos que leer 2 bytes más.
BA 9C, en binario 1011 1010 1001 1100 ⇒ U+4E9C
F0, en binario 1111 0000. Tenemos que leer 3 bytes más.
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Decodificación de UTF-8
Supongamos que tenemos la siguiente cadena de bytes y la queremos
interpretar como UTF-8:
63 C3 B6 E4 BA 9C F0 9D 84 9E
63, en binario 0110 0011 ⇒ U+0063
C3, en binario 1100 0011. Tenemos que leer 1 byte más.
B6, en binario 1011 0110 ⇒ U+00F6
E4, en binario 1110 0100. Tenemos que leer 2 bytes más.
BA 9C, en binario 1011 1010 1001 1100 ⇒ U+4E9C
F0, en binario 1111 0000. Tenemos que leer 3 bytes más.
9D 84 9E, en binario 1001 1101 1000 0100 1001 1110 ⇒
U+1D11E
Maximiliano Geier
Representación de la Información (III)
10/04/2015
11 / 14
Representación de caracteres
Buscando en la tablita
Ahora que tenemos los caracteres en Unicode, hay que buscar en la tabla
qué quieren decir. Nos quedó:
U+0063 U+00F6 U+4E9C U+1D11E
Maximiliano Geier
Representación de la Información (III)
10/04/2015
12 / 14
Representación de caracteres
Buscando en la tablita
Ahora que tenemos los caracteres en Unicode, hay que buscar en la tabla
qué quieren decir. Nos quedó:
U+0063 U+00F6 U+4E9C U+1D11E
Una página que permite buscar caracteres fácilmente teniendo el code
point es http://codepoints.net/
U+0063 LATIN SMALL LETTER C
U+00F6 LATIN SMALL LETTER O WITH DIAERESIS
U+4E9C CJK UNIFIED IDEOGRAPH-4E9C
U+1D11E MUSICAL SYMBOL G CLEF
Maximiliano Geier
Representación de la Información (III)
10/04/2015
12 / 14
Representación de caracteres
Buscando en la tablita
Ahora que tenemos los caracteres en Unicode, hay que buscar en la tabla
qué quieren decir. Nos quedó:
U+0063 U+00F6 U+4E9C U+1D11E
Una página que permite buscar caracteres fácilmente teniendo el code
point es http://codepoints.net/
U+0063 LATIN SMALL LETTER C
U+00F6 LATIN SMALL LETTER O WITH DIAERESIS
U+4E9C CJK UNIFIED IDEOGRAPH-4E9C
U+1D11E MUSICAL SYMBOL G CLEF
El texto final es: cö亜
Maximiliano Geier
Representación de la Información (III)
10/04/2015
12 / 14
Representación de caracteres
Unicode en la vida computacional
El uso más preponderante de UTF-8 se encuentra en la web.
En Marzo de 2015, el 83,3 % de las páginas web se encontraban
codificadas en UTF-8.
A pesar de esto, todavı́a hay ocasiones en las que la codificación de
un texto no queda claro cuál es.
UTF-32 se utiliza para guardar cadenas de caracteres en memoria,
UTF-8 para almacenar y transferir por Internet (en Windows se usa
UTF-16 también).
Maximiliano Geier
Representación de la Información (III)
10/04/2015
13 / 14
Representación de caracteres
Terminando: Unicode en Python
En Python 3, todas las cadenas de caracteres se representan internamente
en Unicode (¡no es el caso en Python 2!).
Los nombres de las variables pueden tener caracteres raros (poco
recomendable), siempre y cuando el archivo .py se encuentre guardado
utilizando la codificación UTF-8.
>>> a~
no = 2015
>>> print(a~
no)
2015
Maximiliano Geier
Representación de la Información (III)
10/04/2015
14 / 14
Representación de caracteres
Terminando: Unicode en Python
En Python 3, todas las cadenas de caracteres se representan internamente
en Unicode (¡no es el caso en Python 2!).
Los nombres de las variables pueden tener caracteres raros (poco
recomendable), siempre y cuando el archivo .py se encuentre guardado
utilizando la codificación UTF-8.
>>> a~
no = 2015
>>> print(a~
no)
2015
Podemos escribir caracteres con su correspondiente código Unicode
utilizando la siguiente notación:
>>> print(’\u4E9C’)
亜
Maximiliano Geier
Representación de la Información (III)
10/04/2015
14 / 14
Representación de caracteres
Terminando: Unicode en Python
En Python 3, todas las cadenas de caracteres se representan internamente
en Unicode (¡no es el caso en Python 2!).
Los nombres de las variables pueden tener caracteres raros (poco
recomendable), siempre y cuando el archivo .py se encuentre guardado
utilizando la codificación UTF-8.
>>> a~
no = 2015
>>> print(a~
no)
2015
Podemos escribir caracteres con su correspondiente código Unicode
utilizando la siguiente notación:
>>> print(’\u4E9C’)
亜
También podemos interpretar una cadena de bytes como UTF-8:
>>> print(b’\x63\xC3\xB6\xE4\xBA\x9C’.decode(’utf-8’))
cö亜
Maximiliano Geier
Representación de la Información (III)
10/04/2015
14 / 14
Descargar