ASCII
Comencemos con el primer estándar bien definido del que muchos de nosotros tenemos conciencia, y que aún hoy en día prevalece, aunque bajo otros nombres.
Aquellos interesados en los detalles históricos, pueden hojear el documento original de 1963 del
ASCII:
http://www.wps.com/projects/codes/X3.4-1963/index.htmlSe debe ser precavidos, ya que ha habido muchos cambios importantes desde esa primera versión original.
Para jugar con la tabla ASCII actual, se puede por ejemplo a esta prolija página:
http://www.elcodigoascii.com.ar/
En
ASCII, a cada número binario, entre 0 y 127 inclusive, llamados
cógitos, el estándar
ASCII asocia un caracter. Hay 33 de ellos que son
no imprimibles, también llamados
de control, puesto que sirven de señalizadores en los dispositivos informáticos para realizar acciones de diverso tipo.
Se reserven los códigos del 0 al 31, y el 127, como
caracteres de control.
El resto, del 32 al 126, son
caracteres imprimibles, lo cual quiere decir que representan información que podemos ver gráficamente.
El primer caracter imprimible, el número 32, se usa para representar el
espacio en blanco.
Los códigos de caracteres se agrupan según ciertos criterios:
* Del 33 al 47 representan signos de puntuación.
* Del 48 al 57 representan dígitos decimales.
* Del 58 al 64 son otros signos de puntuación.
* Del 65 al 90 representan letras mayúsculas del alfabeto inglés.
* Del 91 al 96, más signos de puntuación.
* Del 97 al 122, van las letras minúsculas del alfabeto inglés.
* Del 123 al 126, más signos de puntuación.
Los teclados occidentales en general son muy parecidos, e imitan la disposición de teclas de las antiguas máquinas de escribir, en el ordenamiento "
QWERTY".
Hay variaciones según los países.
En general, hay tres filas de teclas que contienen las letras del alfabeto, y encima de ellas una fila con los dígitos.
Arriba de cada dígito hay un signo de puntuación, que puede generarse presionando la tecla
SHIFT.
El código de los signos de puntuación que está arriba del dígito en el teclado de Estados Unidos, parecieran tener la intención de ser "algo así" como el código del dígito con el que comparten tecla, menos 14.
Pero esta regla de restar 14 no es válida en general.
En cambio, sí tenemos otras reglas bastante precisas:
El dígito N tiene código ASCII 48 + N.
La N-ésima letra mayúscula del alfabeto inglés tiene código ASCII 64 + N.
La N-ésima letra minúscula del alfabeto inglés tiene código ASCII 96 + N.
Cualquier caracter ASCII puede generarse con el teclado, dejando presionada la tecla ALT, y escribiendo en el teclado numérico el código del caracter.
Así, ALT 70 generaría una letra F.
Los caracteres de control pueden generarse directamente con el teclado de la misma manera,
pero también hay un modo alternativo usando la tecla CTRL.
Para ello, para generar el caracter de control con código M,
hay que dejar presionada la tecla CTRL al tiempo que se presiona aquella tecla que genera el caracter con código ASCII 64 + M.

Por ejemplo, CTRL D general el caracter de control con código ASCII 4,
ya que D tiene código 68 = 64 + 4.
De modo similar, dado que el caracter de control para la tecla ESCAPE tiene código ASCII 27,
se ha de generar con la combinación de teclas CTRL [, pues el corchete izquierdo [ tiene código ASCII 91 = 64 + 27.
El caracter de control con código 0, se generaría con CTRL @, pero dado que este signo comparte tecla con el dígito 2, se presiona directamente CTRL 2. (Es posible que esto no funcione en teclados para idioma español).
Si nos fijamos, esto es consecuente con la regla anterior, ya que @ tiene código ASCII 64 = 64 + 0,
permitiendo generar el ASCII 0 en combinación con la tecla CTRL.
No nos vamos a dedicar a generar caracteres de control.
Sin embargo, es útil saber esta regla de "restar 64", porque permite que entendamos algunos textos en donde los caracteres de control se indican mediante el metasigno ^ seguido de un caracter cuyo código ASCII es 64 + M.
O sea, vamos a ver que los caracteres de control se indican mediante:
^@, ^A, ^B, ^C, etc.
Aquí se está interpretando al caracter ^ como un indicador de la tecla CTRL, la cual no tiene caracter asociado.
Sin embargo, si en un archivo de texto escribimos algo como ^B, eso no equivale, claro está, al caracter de control que surge de presionar las teclas CTRL B.
No obstante, el caracter ^ por sí solo no tiene gran utilidad.
Tiene sentido que haya, sin embargo, una tecla con el símbolo ^, porque permite generar letras con acentos circunflejos. Por ejemplo, \( \textsf{\^a,\^e,\^i,\^o,\^u} \).
Si presionamos ALT 127, nos aparece un pequeño pentágono. Sin embargo, ese caracter no es imprimible (no sale en la impresora), aunque puede que a veces se visualice en la pantalla. Representa la tecla DELETE.
Por más que la tabla de caracteres ASCII esté repetida y una otra vez por todo el mundo como un mantra, la vamos a repetir acá también:
Caracteres de control:- 0: ^@ - Caracter nulo.
- 1: ^A - Inicio de encabezado.
- 2: ^B - Comienzo del texto.
- 3: ^C - Fin del texto.
- 4: ^D - Fin de la transmisión.
- 5: ^E - Consulta.
- 6: ^F - Enterado - comprendido.
- 7: ^G - (Sonido-pitido-campanilla).
- 8: ^H - Retroceso o borrar 1 caracter a izquierda.
- 9: ^I - Tabulador horizontal.
- 10: ^J - Avance de línea.
- 11: ^K - Tabulador vertical.
- 12: ^L - Avance de formulario.
- 13: ^M - Retorno de carro.
- 14: ^N - Desplazar salida.
- 15: ^O - Entrar en modo Shift.
- 16: ^P - Escape de enlace de datos.
- 17: ^Q - Control de dispositivo 1.
- 18: ^R - Control de dispositivo 2.
- 19: ^S - Control de dispositivo 3.
- 20: ^T - Control de dispositivo 4.
- 21: ^U - Confrimación negativa.
- 22: ^V - Inactividad sincrónica.
- 23: ^W - Fin del bloque de transmisión.
- 24: ^X - Cancelar.
- 25: ^Y - Fin del medio (¿de transmisión?).
- 26: ^Z - Sustituir.
- 27: ^[ - Escapar.
- 28: ^\ - Separador de archivo.
- 29: ^] - Separador de grupo.
- 30: ^^ - Separador de registro.
- 31: ^_ - Separador de unidad.
- 127: ^? - Eliminar (DELETE).
Como se ve, con CTRL ? se genera el caracter de control DELETE, con código 127.
Aquí la regla de "restar 64" no podría aplicarse, pero si nos imaginamos que DELETE, por ser el "último" caracter de la tabla, puede pensarse como (dando la vuelta), uno que está "antes" del primero de todos (el 0), entonces lo estaríamos pensando como que si tuviera código "-1", y así se obtiene con CTRL ? debido a que el caracter ? tiene código 63 = 64 + (-1).
Como se puede apreciar, los significados dados a los
caracteres de control actúan como señaladores en la transmisión y organización de datos transmitidos por dispositivos informáticos.
En realidad este significado es muy obsoleto en la mayoría de los casos, pues se refiere a convenciones adoptadas para imprimir datos en los antiguos
teletipos, o en las
impresoras de matriz de puntos.
Hoy en día todo eso ha quedado atrás, pues los dispositivos han evolucionado mucho, y se conservan sólo algunos
caracteres de control en uso,
que todavía sirven para interpretar los archivos de texto sencillos (sin formatos), que son los famosos archivos de extensión
TXT.
Por otra parte, el significado de esos caracteres puede que no sea respetado por los distintos sistemas operativos, ni por los diferentes programas que hagan algún tipo de manejo de datos.
Tampoco es necesario que se respete ese significado en los protocolos de transmisión de datos por Internet, o redes en general, ni siquiera en la comunicación de la computadora con los periféricos.
Según la ocasión, esos significados pueden cambiarse a conveniencia.
Sin embargo, hay algunos casos que conservan su significado de modo "clásico", como los que se indican con secuencias de escape en el lenguaje
C, correspondientes a los códigos ASCII del 7 al 13:
- 7: \a - (Sonido-pitido-campanilla).
- 8: \b - Retroceso o borrar 1 caracter a izquierda.
- 9: \t - Tabulador horizontal.
- 10: \n- Avance de línea.
- 11: \v - Tabulador vertical.
- 12: \f - Avance de formulario.
- 13: \r - Retorno de carro.
Como se puede apreciar, tras el caracter de escape
\ (barra invertida), va una letra, que nada tiene que ver con la regla de "restar 64" que antes habíamos dolorosamente aprendido.
En general conviene suponer que los caracteres de control pueden cambiar su significado de un sistema a otro, así que no conviene aprenderse esos números de código.
Aún en el caso de que los estándares se tomen el trabajo de fijar significados para esos códigos, es probable que los programas y demás sistemas informáticos redefinan el sentido de esos códigos.
Por ejemplo, en sistemas MS-DOS y Windows, en línea de comandos, muchos de los caracteres de control no significan nada.
Mientras que CTRL C significa "interrumpir proceso", CTRL P significa "imprimir lo que hay en pantalla", CTRL Z significa "fin de archivo de texto".
Hay sistemas en los que el "retorno de carro" seguido del "avance de línea" son dos cosas distintas, representadas por una secuencia de 2 caracteres de control distintos, mientras que en otros se utiliza un solo caracter de control que hace las dos cosas juntas.
En la mayoría de compiladores del lenguaje
C se utiliza la secuencia de escape
\e para indicar el ASCII 27 (caracter ESCAPE), aunque esto no está definido por el estándar ISO.
El sentido de ASCII 127 ha variado en distintos sistemas.
Parece extraño que haya un caracter de control "suelto", aislado de la lista de los primeros 32.
En la prehistoria

cuando se usaban los teletipos, se usaba el ASCII 127 para poner una marca de borrado, ya que en binario el 127 está formado por puros 1s, que imagino que se usaban para indicar que estaban "todos los bits tachados".
Dado que en la actualidad se sigue conservando la convención de dejar los códigos 0 a 31 como caracteres de control, es buena idea utilizarlos en nuestros programas para fines especiales, y así "dejar en paz" a los caracteres imprimibles, que se usarían sólo como el trazo de texto que representan.
Sin embargo, no podemos asegurar que todo el mundo respete esta práctica de apariencia saludable.
No sabemos si hay gente que utiliza algunos caracteres de la "zona de imprimibles" como "caracteres de control" en alguna aplicación o sistema específico.
En las
fuentes de texto más comunes, usadas en Internet (o sea, en páginas
HTML), Windows, y quizá también Linux (digo "quizá", porque no estoy seguro del todo), podemos esperar que no haya superposición entre los
caracteres de control y los
caracteres imprimibles.
Pasemos finalmente a exhibir los
caracteres imprimibles de la tabla ASCII:
- 32: (espacio en blanco)
- 33 a 47: ! " # $ % & ' ( ) * + , - . /
- 48 a 63: 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
- 64 a 79: @ A B C D E F G H I J K L M N O
- 80 a 95: P Q R S T U V W X Y Z [ \ ] ^ _
- 96 a 111: ` a b c d e f g h i j k l m n o
- 112 a 126: p q r s t u v w x y z { | } ~
La razón para haberlos agrupado en conjuntos de 16 códigos, es para entender mejor su representación binaria.
Les dejamos como ejercicio a los lectores jugar con la representación binaria de los códigos ASCII.
Pongamos sólo algunos ejemplo.
Por ejemplo, los códigos para 0, @, A, Z, |, son:
ASCII 48: 0 --- 011 0000
ASCII 64: @ --- 100 0000
ASCII 65: A --- 100 0001
ASCII 90: Z --- 101 1010
ASCII 124: | --- 111 1100
Notemos que, si el código binario de un dígito \( \xi \) es \( b_3b_2b_1b_0 \) (donde \( b_i \) son los bits del dígito \( \xi \)),
entonces su código ASCII es \( 011b_3b_2b_1b_0 \).
Si una letra del alfabeto inglés es la \( n \)-ésima en orden alfabético, y \( n \) tiene en binario la representación b_4b_3b_2b_1b_0,
entonces el código ASCII de esa letra en mayúsculas es \( 10b_4b_3b_2b_1b_0 \),
y el código ASCII de esa misma letra, pero en minúsucuas, es \( 11b_4b_3b_2b_1b_0 \).
Se ve entonces que, para transforma de mayúscula a minúscula y viceversa, basta cambiar tan sólo el 6to dígito (contando de derecha a izquierda).
De nuevo, no conviene aprenderse esos números, ni esas reglas de codificación,
pues en los lenguajes de programación o en los sistemas de computación,
siempre podemos encontrarnos con sorpresas.
Que los estándares existan, no quiere decir que todo el mundo los siga.
Entonces siempre hay que estar atentos a cuál sistema de codificación se usa en tal o cual situación.
Lo ideal es que todo tienda a un único método uniformizado de codificación, pero por diversos motivos siempre hay obstáculos en este aspecto, y el código universal único jamás se logra del todo.