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