Entendiendo Unicode (Facundo Batista)

download Entendiendo Unicode (Facundo Batista)

If you can't read please download the document

description

Facundo Batista presentation explaining how Unicode works (in Python).

Transcript of Entendiendo Unicode (Facundo Batista)

2. Qu es Unicode?Un estndarPero en qu consiste?Un repertorio de ms de 100 mil caracteresPlanillas de cdigos para referencia visualMetodologas de codificacinCodificaciones estndaresEnumeracin de propiedades de los caracteresEtc... 2 3. Pero esto cmose come?3 4. Masticando un Code ChartUna planilla de cdigos es una tabla con eldibujo de cada caracterEl mapa completo de caracteres de Unicodeest divido en varios codechartsPor ejemplo:Basic LatinLatin-1GreekRunic4 5. Un estndar con carcterPor cada caracter tenemos:Un glifo (de referencia, no prescriptivo)Un nombreUn nmeroMs infoEjemplo:03C0GREEK SMALL LETTER PImath constant 3.141592...5 6. Y en Python?Definimos el caracter segn su cdigo >>> pi = u"u03c0" >>> len(pi) 1Y cmo se ve? >>> print pi >>> pi uu03c0 >>> pi == u"" True6 7. BititosUnicode es muy lindo... pero como lopersistimos o transmitimos?Tenemos que traducir los caracteresUnicode a bits.Codificar o EncodePasar de un caracter Unicode a una secuencia de bytesDecodificar o DecodePasar de una secuencia de bytes a un caracter Unicode7 8. Vamos de nuevo 8 9. No es directo?Necesitamos codificar la informacin de unaforma estndarNo es exclusivo de Unicode, nos pasa conlos nmeros tambinEjemplo: NmerosNegativos: Complemento a 1 o a 2 -3 puede ser (bin) 1100 o 1101Punto flotante: Precisin simple y cudruple 1.0 puede ser (hex) 3F80 0000 o 3FFF 0000 0000 0000 0000 0000 0000 0000 9 10. Codificando UnicodeCmo representamos en bits un caracterUnicode?Tenemos que inventar un cdigoDefinir cuantos bits usarDefinir las reglas de conversinYa tenemos muchos cdigos estndaresASCIILatin-1 (ISO-8859-1)UTF-8, -16, -32etc10 11. Distintas formas de lo mismoDistintos encodings, distintos bytes:>>> enie = u"">>> enie.encode("latin1")xf1>>> enie.encode("utf8")xc3xb1>>> enie.encode("utf16")xffxfexf1x00Pero cmo hacemos la decodificacin?Necesitamos s o s saber el cdigo usado11 12. Pero cul uso? Latin1Est muy extendidoNo se mantiene desde 2004No representa todos los caracteres:>>> print pi>>> pi.encode("latin1")...UnicodeEncodeError: latin-1 codec cantencode character uu03c0...Se utiliza un bytePrimeros 128 caracteres: ASCIISegundos 128: para lenguajes de Europa occidental12 13. Pero cul uso? UTF-16Soporta todos los caracteresPero tenemos que perder dos bytes por caracter (ms elBOM!)Incluso si utilizamos caracteres simples, como en estalinea. >>> u"esta".encode("utf16") xffxfeex00sx00tx00ax00 >>> # FFFE 6500 7300 7400 6100Utiliza desde 2 bytesUsa dos bytes para el BMP, pero puede usar 4 bytesSe justifica si siempre tengo caracteres rarosNo es UCS-2 (el cual usa 2 bytes fijos)13 14. Pero cul uso? UTF-8Es el estndar en LinuxSoporta todo el espacio UnicodeUtiliza uno, dos, tres y cuatro bytes, segn necesite >>> u"k".encode("utf8") k >>> u"".encode("utf8") xc3xb1 >>> u" ".encode("utf8") xecx8fx94Nunca se desactualizara14 15. uteefe-ocho8 bits para los 128 caracteres ASCII 0-7F: 0zzzzzzz16 bits para letras latinas y de otros idiomas 80-7FF: 110yyyyy 10zzzzzz24 bits para el resto del BMP 800-D7FF y E000-FFFF: 1110xxxx 10yyyyyy 10zzzzzz32 bits para el resto de Unicode 1000010FFFF: 11110www 10xxxxxx 10yyyyyy 10zzzzzz15 16. Encoding & Decoding >>> pi uu03c0 >>> d = pi.encode("utf8") >>> d xcfx80 >>> d.decode("utf8") uu03c0Python guarda las cadenas Unicode como bitsUsa una codificacin interna en particularSe decide al compilar Python: UCS-2 o UCS-416 17. Y dale...Hasta que lo sepan de memoria!17 18. Reglas de oroInternamente siempre utilizar Unicode>>> dato = mxc3xa1scara # mscara en UTF8>>> len(dato)8>>> print dato[:4]ms>>> print dato.upper()MSCARACodificar y decodificar en los bordesencode/decodecodecs.open() 18 19. Siempre en los bordes>>> nomapell = MiBDDWrapper(foo, bar) 1. Leemos de una>>> nomapellxc5mal xd6fwermanfuente externa >>> completo = nomapell.decode("latin1") >>> completo3. Procesamos uxc5mal xd6fwermaninternamente >>> print completo>>> n, a = completo.split() mal fwerman>>> tit = "%s, %s" % (a, n)>>> print titfwerman, mal 2. Pasamos a Unicode (decode)>>> titok = tit.encode("utf8")4. Pasamos a bytes>>> titokxc3x96fwerman, xc3x85mal (encode)Ejemplo! 5. Dejamos el resultado >>> alHTML(titok) 19 20. Cdigo fuente UnicodeCaracteres Unicode en nuestro cdigoEl editor tambin debe traducir a bytesLo codifica!El intrprete de Python debe saber leerloLo decodifica!Tiene que saber qu encoding se us#-*- coding: X -*-20 21. Cosas piolas>>> unicodedata.name(pi)GREEK SMALL LETTER PI>>> print unicodedata.lookup("GREEK SMALL LETTER THETA")>>> print u"cao de desage".upper()CAO DE DESAGE>>> print pi, pi.upper()>>> unicodedata.decomposition(u"")006E 0303>>> print u"u006e u0303"n 21 22. Muchas gracias!Preguntas?Sugerencias?Facundo Batista [email protected]://www.taniquetil.com.arLicencia: Creative CommonsAtribucin-NoComercial-CompartirDerivadasIgual 2.5 Argentinahttp://creativecommons.org/licenses/by-nc-sa/2.5/deed.es_AR 22