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 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
ASCII Respuesta 1: ASCII (American Standard for Information Interchange 1963) Maximiliano Geier Representación de la Información (III) 10/04/2015 3 / 14
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
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
ISO-8859-1 (Latin-1) Respuesta 2: Latin-1 Maximiliano Geier Representación de la Información (III) 10/04/2015 5 / 14
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
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
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
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, Bengaĺı, 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
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, Bengaĺı, 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
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 (2 17 = 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
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 (2 17 = 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
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 (2 17 = 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
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 (2 17 = 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
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
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
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
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
Codificación en UTF-8 En UTF-8 se utiliza la siguiente tabla para codificar caracteres Unicode: Bits Inicio Fin Byte 1 Byte 2 Byte 3 Byte 4 7 U+0000 U+007F 0xxxxxxx 11 U+0080 U+07FF 110xxxxx 10xxxxxx 16 U+0800 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx 21 U+10000 U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx Vamos a codificar el texto 名字, que corresponde a los caracteres Unicode U+540D U+5B57 1 1 http://www.fileformat.info/info/unicode/char/search.htm Maximiliano Geier Representación de la Información (III) 10/04/2015 9 / 14
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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