Mostrando entradas con la etiqueta ascii. Mostrar todas las entradas
Mostrando entradas con la etiqueta ascii. Mostrar todas las entradas

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:
     _________     
    ║_║_║_║_║
   /________\    
__/__■_■_■_■_\___
\■■■■■■■■■■■■■■■/
 \             / 
  \___________/  

domingo, 29 de abril de 2012

Efectos de consola, parte 1

Cuando aprendemos a programar en Python, nuestros programas interactúan con el usuario a través de algo llamado la "consola".  La consola es una ventana donde sólo se visualiza información de texto- nada de gráficos, menús desplegables, gadgets ni nada de esas cosas a las cuales nos han (mal?) acostumbrado aplicaciones que usan GUIs (Graphical User Interface).  Siendo Python un lenguaje de alto nivel utilizado para desarrollar aplicaciones rápidamente en sistemas operativos modernos, es evidente que existe en este lenguaje formas de incluir GUIs en nuestras aplicaciones.  Por ejemplo, podríamos usar las librerías de Tcl/Tk para crear estas interfaces gráficas.  Sin embargo, hay que aprender un poco más de Python y de programación para poderlas usar y se supone que nosotros somos principiantes...

En esta serie de posts, vamos a comentar un poco sobre como lograr ciertos "efectos" con la consola.  Vamos a empezar con los más básicos.

Cuando dentro de un literal de cadena incluimos un caracter de barra diagonal invertida ("\"), estamos indicandole al interprete de Python que queremos imprimir un caracter especial.  La barra diagonal invertida se conoce como caracter de escape y la secuencia completa de la barra diagonal más otro caracter se conoce como secuencia de escape.  Algunas secuencias de escape son:

\n  Salto de línea.  Ejemplo:

               print "Esto se coloca en una línea.\nY esto va en la siguiente línea"

        Imprime lo siguiente:

      Esto se coloca en una línea.
      Y esto va en la línea siguiente

\r   Es el retorno de carro, con lo cual se ubica el cursor al principio de la línea actual. Ejemplo:

      print "Esto se coloca en una línea.\rVolvemos al principio."

        Imprime lo siguiente:

      Volvemos al principio.línea.


\b Es el backspace, que retrocede el cursor una posición a la izquierda.  Ejemplo:

      print "José\b\b\b\bLuis aprende Python."

      Imprime lo siguiente:

      Luis aprende Python.


\"   Imprime comillas.  Recuerde que para definir cadenas en Python las encerramos entre comillas, pero si queremos imprimir una comilla, necesitamos indicarla de alguna forma que Python no "piense" que estamos delimitando el principio o el fín de una cadena.  Ejemplo:

      print "Cuando corri mi primer programa de Python, la salida leía \"Hola Mundo\""

       Imprime lo siguiente:


       Cuando corri mi primer programa de Python, la salida leía "Hola Mundo"

\a   Emite un "beep" sonoro.  Ejemplo:

            print "¡Despierta!\a"


        Imprime "¡Despierta!" y luego suena un beep.

\t   Tabulador horizonal.  Ejemplo

        print"Esto es una tabla:\nJosé\t1\nMiguel\t2\nPedro\t3\n"

        Imprime lo siguiente:

        Esto es una tabla:
        José    1
        Miguel  2
        Pedro   3


\v  Tabulador vertical.  Ejemplo

        print "Tabulador vertical\vSiguiente línea..."

        Imprime lo siguiente (observe que salta a la siguiente línea pero mantiene la posición horizontal del cursor):

        Tabulador vertical
                          Siguiente línea...



\f  Form feed.  En las impresoras, esto hacia que se alimentara la siguiente hoja de papel.  En la consola, el efecto es aparentemente igual al del tabulador vertical.  Ejemplo:

        print "pagina 1\fpagina 2\fpagina 3"


        Imprime:

        pagina 1
                pagina 2
                        pagina 3


\xhh   Imprime el carácter cuyo código ASCII es hh.  Ejemplo:

        print "Una a mayuscula: \x41"

        Imprime:

        Una a mayuscula: A


Es interesante notar que todos los caracteres especiales que se mencionan en todas estas secuencias de escape (salvo la última) representan carácteres con códigos ASCII definidos.  Así por ejemplo, la secuencia "\t" representa un solo caracter cuyo código ASCII es 9 (en decimal).  Veamos los códigos ASCII correspondientes a algunas de estas secuencias de escape:

    print "Salto de línea\t\t"+str(ord("\n"))+"\nRetorno de carro\t"+str(ord("\r"))

Con lo cual se imprime:

    Salto de línea      10
    Retorno de carro    13


La función ord() devuelve el código ASCII correspondiente al caracter suministrado en su argumento.  La función str() convierte el número entero que devuelve ord() a una cadena, para que se pueda concatenar todo como una sola cadena.  Otra función relacionada es chr(), la cual devuelve el caracter asociado al código ASCII que se suministra como su argumento.  Si queremos imprimir carácteres que no aparecen en nuestro teclado, buscamos su código ascii y lo indicamos mediante la función chr() o mediante la secuencia de escape "\xhh" donde hh es el código ASCII del carácter en cuestión, pero en hexadecimal.