sábado, 5 de mayo de 2012

Efectos de consola, parte 2

Sistemas de codificación de caracteres - Unicode


En la parte 1 de esta serie de posts vimos cómo imprimir algunos caracteres especiales que normalmente no podríamos indicar encerrandolos entre comillas. Para indicar estos caracteres, utilizabamos lo que se llaman secuencias de escape y en particular, había una para imprimir cualquier caracter ASCII- \xhh, en donde hh son los dos dígitos hexadecimales que conforman el còdigo ASCII del caracter.

El código ASCII es un estándar para la representación de símbolos y caracteres alfanuméricos. Cualquiera de los símbolos de uso común se podía representar como un byte (un octeto de bits) y consecuentemente, la tabla de caracteres ASCII comprendía hasta 256 símbolos. Entre estos, los primeros 128 símbolos eran comúnes a todos los sistemas de computadoras y comprendian el conjunto de símbolos de puntuación, el espacio, las 26 letras mayúsculas y minúsculas (excluyendo la eñe, la c con cedilla y otros caractéres regionales) y los 10 dígitos numéricos, o sea, los símbolos que comúnmente figuran en cualquier teclado.

Pronto se vió la necesidad de extender este conjunto de símbolos para poder incluir símbolos y letras de otras lenguas no europeas que usaban alfabetos distintos al romano. Ya de por sí el ASCII (por lo menos el conjunto de los primeros 128 símbolos verdaderamente estándar) era insuficiente para representar caracteres particulares de algunas lenguas europeas (como la ñ o las vocales con acentos en español, las vocales con dieresis y la ß alemana, etc.). Con esto en mente, se creo el estandar unicode a finales de la década de los 80.

Los códigos unicode son de longitud variable y las tablas de caracteres unicode se pueden consultar en http://www.unicode.org/charts/. A continuación un resúmen de los bloques de caracteres que me parecieron más interesantes:

Bloque Unicode Descripción
0000–007F Caracteres de control y Latin básico (este bloque es igual al primer bloque de los 128 caracteres ASCII)
2300–23FF Caracteres técnicos miscelaneos: símbolos de ingeniería, computación, químicos, diagramas eléctricos, etc.
2500–257F Caracteres para dibujo de cajas
2580–259F Bloques y cuadrantes.
2600-26FF Símbolos miscelaneos y de juegos: meteorología, astrología, signos viales, piezas de ajedrez, dados, símbolos religiosos y políticos, etc.
2700–27BF Dingbats - más símbolos miscelaneos.
2B00–2BFF Figuras geométricas y flechas


Existen dos sistemas de mapeo de caracteres unicode: el UTF (Unicode Transformation Format) y el UCS (Universal Character Set). Entre los sistemas UTF, los encodings (sistemas de codificación) más usados son el UTF-8, el UTF-16 y el UTF-32. Básicamente, el encoding UTF-8 es un encoding de 8 bits en los cuales cada caracter se representa como una secuencia de longitud variable de bytes (de 1 a 4 bytes). El UTF-8 permite una máxima compatibilidad con el sistema de codificación ASCII, pues los primeros 256 caracteres (codificación de 1 byte de longitud) son los caracteres ASCII. Los sistemas UTF-16 y UTF-32 son para máquinas con arquitecturas de 16 o 32 bits, lo cual no quiere decir que en estas máquinas no se pueda usar la codificación UTF-8.

Métodos de entrada de caracteres Unicode y cómo trabajar con Unicode en Python

En Linux, podemos ingresar caracteres Unicode desde la consola o editor de textos (o inclusive desde este navegador) apretando las teclas CTRL ( ⌃⃣ ) y SHIFT ( ⇧⃣ ) juntas.  Manteniendo estas teclas apretadas, tecleamos la letra "U"  seguida de los cuatro dígitos hexadecimales correspondientes al código Unicode del caracter que queremos.  Así por ejemplo:


Secuencia de Teclas Aparece el símbolo
⌃⃣ + ⇧⃣ + U⃣ + 2⃣ + 3⃣ + 1⃣ + A⃣ de un reloj: ⌚
⌃⃣ + ⇧⃣ + U⃣ + 2⃣ + 5⃣ + 0⃣ + C⃣ esquina de una caja: ┌
⌃⃣ + ⇧⃣ + U⃣ + 2⃣ + 6⃣ + 1⃣ + 5⃣ taza de té caliente: ☕
⌃⃣ + ⇧⃣ + U⃣ + 2⃣ + 6⃣ + 3⃣ + A⃣ soy feliz tomando té: ☺

Para trabajar con expresiones en Python que contengan caracteres unicode en literales de cadena, tenemos que agregar la letra u antes de las comillas del literal de la cadena.  Dentro de las comillas, colocamos la secuencia de escape \u (Ver Efectos de consola, parte 1) seguida de los cuatro digitos hexadecimales del caracter.  Al imprimir estas cadenas, se verán los caracteres unicode indicados por las secuencias de escape.  De esta forma, uno de mis estudiantes del curso de Python que dicto en la UNEFA creo un pequeño script en Python que dibuja una embarcación:

b=u"\u005C"
a=u"\u002F"
c=u"\u005F"
d=" "
e=u"\u25a0"
f=u"\u2551"
g=f+c+f
ab=g+c+g+c+g+c+f+c+c+f
cadena1=(2*d)+b+(11*c)+a+(2*d)
cadena2= d+b+(13*d)+a+d
cadena3=b+15*e+a
cadena4=2*c+a+2*c+e+c+e+c+e+c+e+c+b+3*c
cadena5=3*d+a+8*c+b+4*d
cadena6=(4*d)+f+c+g+c+g
cadena7=(5*d)+c+c+c+c+c+c+(2*c)+c+(5*d)
print cadena7
print cadena6
print cadena5
print cadena4
print cadena3
print cadena2
print cadena1


Este script dibuja un barquito en la pantalla:
     _________     
    ║_║_║_║_║
   /________\    
__/__■_■_■_■_\___
\■■■■■■■■■■■■■■■/
 \             / 
  \___________/  

No hay comentarios:

Publicar un comentario