Story Transcript
Representaci´on de la Informaci´on (III) Representaci´ on de Caracteres
Maximiliano Geier
10/04/2015
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
1 / 14
Representaci´ on de caracteres
Representaci´on de caracteres
La memoria contiene bits, ceros y unos dispuestos en alg´ un orden que se pueden interpretar de diferentes formas. Hasta ahora estuvimos viendo distintas maneras de representar n´ umeros. ¿C´omo hacemos para guardar en memoria la cadena de caracteres icb2015?
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
2 / 14
Representaci´ on de caracteres
ASCII Respuesta 1: ASCII (American Standard for Information Interchange – 1963)
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
3 / 14
Representaci´ on de caracteres
EBCDIC Respuesta 1 bis: EBCDIC (Extended Binary Coded Decimal Interchange Code – 1963, IBM)
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
4 / 14
Representaci´ on 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´ on de la Informaci´ on (III)
10/04/2015
4 / 14
Representaci´ on de caracteres
ISO-8859-1 (Latin-1) Respuesta 2: Latin-1
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
5 / 14
Representaci´ on de caracteres
ISO-8859-1 (Latin-1) Respuesta 2: Latin-1
¿Y ahora si quiero codificar 你什么名字? Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
5 / 14
Representaci´ on de caracteres
Unicode Para unificar la codificaci´ on de caracteres en todas las lenguas del mundo se defini´o un standard, llamado Unicode, que establece una numeraci´on uniforme para 113.021 caracteres (versi´on 7.0, Junio 2014) en 123 scripts diferentes
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
6 / 14
Representaci´ on de caracteres
Unicode Para unificar la codificaci´ on de caracteres en todas las lenguas del mundo se defini´o un standard, llamado Unicode, que establece una numeraci´on uniforme para 113.021 caracteres (versi´on 7.0, Junio 2014) en 123 scripts diferentes A esta lista de caracteres se la conoce como UCS (Universal Character Set)
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
6 / 14
Representaci´ on de caracteres
Unicode Para unificar la codificaci´ on de caracteres en todas las lenguas del mundo se defini´o un standard, llamado Unicode, que establece una numeraci´on uniforme para 113.021 caracteres (versi´on 7.0, Junio 2014) en 123 scripts diferentes A esta lista de caracteres se la conoce como UCS (Universal Character Set) ´ Algunos scripts incluidos: Arabe, 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´es y coreano), S´anscrito v´edico, Javan´es, Khmer, Mongol, Tibetano, Braille, Runas, Klingon, etc.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
6 / 14
Representaci´ on de caracteres
Unicode Para unificar la codificaci´ on de caracteres en todas las lenguas del mundo se defini´o un standard, llamado Unicode, que establece una numeraci´on uniforme para 113.021 caracteres (versi´on 7.0, Junio 2014) en 123 scripts diferentes A esta lista de caracteres se la conoce como UCS (Universal Character Set) ´ Algunos scripts incluidos: Arabe, 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´es y coreano), S´anscrito v´edico, Javan´es, Khmer, Mongol, Tibetano, Braille, Runas, Klingon, etc. Unicode establece el mapa de caracteres, pero no c´omo se codifican. ¿C´omo hacemos? Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
6 / 14
Representaci´ on de caracteres
UCS y UTF UCS define una manera de codificar los caracteres, utilizando el n´ umero 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´ on.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
7 / 14
Representaci´ on de caracteres
UCS y UTF UCS define una manera de codificar los caracteres, utilizando el n´ umero 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´ on. Inicialmente UCS-2, luego UCS-4.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
7 / 14
Representaci´ on de caracteres
UCS y UTF UCS define una manera de codificar los caracteres, utilizando el n´ umero 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´ on. 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´ on es: 68 6F 6C 61 | 20 6D 75 6E | 64 6F
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
7 / 14
Representaci´ on de caracteres
UCS y UTF UCS define una manera de codificar los caracteres, utilizando el n´ umero 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´ on. 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´ on es: 68 6F 6C 61 | 20 6D 75 6E | 64 6F Soluci´ on: usar codificaciones de longitud variable (UTF = UCS Transformation Format) Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
7 / 14
Representaci´ on de caracteres
UTF UTF define diversos sistemas de transformaci´ on del c´ odigo de un caracter a su representaci´on en memoria. Para indicar el tipo, se suele utilizar un n´ umero que representa la cantidad de bits que tiene cada unidad de c´ odigo (code unit) del formato. Los formatos UTF m´as utilizados son UTF-32, UTF-16 y UTF-8.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
8 / 14
Representaci´ on de caracteres
UTF UTF define diversos sistemas de transformaci´ on del c´ odigo de un caracter a su representaci´on en memoria. Para indicar el tipo, se suele utilizar un n´ umero que representa la cantidad de bits que tiene cada unidad de c´ odigo (code unit) del formato. Los formatos UTF m´as utilizados son UTF-32, UTF-16 y UTF-8. UTF-32 equivalente a UCS-4.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
8 / 14
Representaci´ on de caracteres
UTF UTF define diversos sistemas de transformaci´ on del c´ odigo de un caracter a su representaci´on en memoria. Para indicar el tipo, se suele utilizar un n´ umero que representa la cantidad de bits que tiene cada unidad de c´ odigo (code unit) del formato. Los formatos UTF m´as 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´ odigo tiene un valor superior a U+10000.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
8 / 14
Representaci´ on de caracteres
UTF UTF define diversos sistemas de transformaci´ on del c´ odigo de un caracter a su representaci´on en memoria. Para indicar el tipo, se suele utilizar un n´ umero que representa la cantidad de bits que tiene cada unidad de c´ odigo (code unit) del formato. Los formatos UTF m´as 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´ odigo tiene un valor superior a U+10000. UTF-8 toma como base ASCII, codificaci´ on de longitud variable entre 1 y 4 code units de 8 bits.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
8 / 14
Representaci´ on de caracteres
Codificaci´on 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´ on de la Informaci´ on (III)
10/04/2015
9 / 14
Representaci´ on de caracteres
Codificaci´on en UTF-8 (cont.)
Primero escribimos ambos n´ umeros en binario: 540D = 0101 0100 0000 1101 5B57 = 0101 1011 0101 0111
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
10 / 14
Representaci´ on de caracteres
Codificaci´on en UTF-8 (cont.)
Primero escribimos ambos n´ umeros en binario: 540D = 0101 0100 0000 1101 5B57 = 0101 1011 0101 0111 Como ocupan 15 bits, tenemos que usar la codificaci´ on 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´ on de la Informaci´ on (III)
10/04/2015
10 / 14
Representaci´ on de caracteres
Decodificaci´on 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´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Decodificaci´on 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´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Decodificaci´on 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´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Decodificaci´on 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´as.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Decodificaci´on 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´as. B6, en binario 1011 0110 ⇒ U+00F6
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Decodificaci´on 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´as. B6, en binario 1011 0110 ⇒ U+00F6 E4, en binario 1110 0100. Tenemos que leer 2 bytes m´as.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Decodificaci´on 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´as. B6, en binario 1011 0110 ⇒ U+00F6 E4, en binario 1110 0100. Tenemos que leer 2 bytes m´as. BA 9C, en binario 1011 1010 1001 1100 ⇒ U+4E9C
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Decodificaci´on 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´as. B6, en binario 1011 0110 ⇒ U+00F6 E4, en binario 1110 0100. Tenemos que leer 2 bytes m´as. BA 9C, en binario 1011 1010 1001 1100 ⇒ U+4E9C F0, en binario 1111 0000. Tenemos que leer 3 bytes m´as.
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Decodificaci´on 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´as. B6, en binario 1011 0110 ⇒ U+00F6 E4, en binario 1110 0100. Tenemos que leer 2 bytes m´as. BA 9C, en binario 1011 1010 1001 1100 ⇒ U+4E9C F0, en binario 1111 0000. Tenemos que leer 3 bytes m´as. 9D 84 9E, en binario 1001 1101 1000 0100 1001 1110 ⇒ U+1D11E Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
11 / 14
Representaci´ on de caracteres
Buscando en la tablita Ahora que tenemos los caracteres en Unicode, hay que buscar en la tabla qu´e quieren decir. Nos qued´ o: U+0063 U+00F6 U+4E9C U+1D11E
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
12 / 14
Representaci´ on de caracteres
Buscando en la tablita Ahora que tenemos los caracteres en Unicode, hay que buscar en la tabla qu´e quieren decir. Nos qued´ o: U+0063 U+00F6 U+4E9C U+1D11E Una p´agina que permite buscar caracteres f´acilmente 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´ on de la Informaci´ on (III)
10/04/2015
12 / 14
Representaci´ on de caracteres
Buscando en la tablita Ahora que tenemos los caracteres en Unicode, hay que buscar en la tabla qu´e quieren decir. Nos qued´ o: U+0063 U+00F6 U+4E9C U+1D11E Una p´agina que permite buscar caracteres f´acilmente 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¨o亜 Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
12 / 14
Representaci´ on de caracteres
Unicode en la vida computacional El uso m´as preponderante de UTF-8 se encuentra en la web. En Marzo de 2015, el 83,3 % de las p´aginas web se encontraban codificadas en UTF-8. A pesar de esto, todav´ıa hay ocasiones en las que la codificaci´on de un texto no queda claro cu´al 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´en).
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
13 / 14
Representaci´ on 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´ on UTF-8. >>> a~ no = 2015 >>> print(a~ no) 2015
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
14 / 14
Representaci´ on 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´ on UTF-8. >>> a~ no = 2015 >>> print(a~ no) 2015 Podemos escribir caracteres con su correspondiente c´ odigo Unicode utilizando la siguiente notaci´ on: >>> print(’\u4E9C’) 亜
Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
14 / 14
Representaci´ on 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´ on UTF-8. >>> a~ no = 2015 >>> print(a~ no) 2015 Podemos escribir caracteres con su correspondiente c´ odigo Unicode utilizando la siguiente notaci´ on: >>> print(’\u4E9C’) 亜 Tambi´en podemos interpretar una cadena de bytes como UTF-8: >>> print(b’\x63\xC3\xB6\xE4\xBA\x9C’.decode(’utf-8’)) c¨ o亜 Maximiliano Geier
Representaci´ on de la Informaci´ on (III)
10/04/2015
14 / 14