7.1.2b El teclado en Linux
§1 Sinopsis
En este capítulo abordaremos los detalles del tratamiento que hace Linux de la información recibida del teclado ("Scan codes"), y como es procesada antes de pasar a las aplicaciones.
Debemos advertir que en éste, como el resto de asuntos que conciernen a este Sistema Operativo, el tratamiento del la información recibida desde el teclado es altamente configurable. Empezando por la propia rutina de servicio de la interrupción 9, que puede ser alterada dentro de ciertos límites. Advertir también que algunas aplicaciones, especialmente los entornos gráficos, disponen de sus propias rutinas de interpretación del teclado. En este capítulo nos referimos exclusivamente a los aspectos relativos al SO, que subyacen en todas las aplicaciones, y en los relacionados con el manejo de consolas.
El precio de la flexibilidad es que el control del teclado puede llegar a convertirse en una pesadilla para e neófito. En palabras de Andries Brouwer: "Most Unix programs get their tty input via the kernel tty driver in 'cooked' mode, and a simple stty command determines the erase character. However, programs like bash and emacs and X do their own input handling, and have to be convinced one-by-one to do the right thing."
Nota: Los procesos y localización de ficheros se refieren a Suse Linux 9.2.
§2 Servicio de teclado
La descripción de los procesos de bajo nivel incluidos en páginas anteriores ( 7.1.1), que ocurren tras la pulsación de una tecla, corresponden al comportamiento tradicional de la interrupción 9 de la BIOS (servicios de teclado). En el estado actual del kernel (2005), los sistemas Linux instalan su propia rutina de servicio. El comportamiento es similar al descrito (que corresponde a MS-DOS), aunque hay ligeras diferencias en la forma de transformar los códigos de exploración "Scancodes", en caracteres en el búfer del teclado ("Keycodes").
Hemos señalado ( 7.1.1) que salvo raras excepciones, las teclas producen dos tipos de códigos. La mayoría produce un make code de 7 bits, en el rango 01-7Fh (en realidad de 8 bits, con el bit 7 a cero). Mientras que otras producen dos códigos de acción (otros dos en la liberación), de los cuales el primero es de 8 bits (el carácter E0h), y el segundo de 7 bits. Recordemos también que, salvo los de teclas de conmutación ( 7.1) que alteran el comportamiento de otras, los "Break codes" son descartados.
Para los códigos de exploración entre 1 y 88 (01-58h), la rutinas de servicio de la interrupción 9 de Linux hace keycode = scancode. Para el resto (59-7Fh) y para los pares E0-00h / E0-7Fh, la relación por defecto entre scancodes y keycodes es la siguiente:
Nota: scancodes en hexadecimal. keycodes en decimal
|
|
Para los scancodes mostrados en las tablas, en los que el kernel no establece que keycode = scancode, es posible asignar al keycode un valor cualquiera en el rango 1-127, mediante el comando
setkeycodes scancode keycode
scancode
es el código de exploración (en hexadecimal), y keycode
es el código resultante deseado (en decimal). Por ejemplo, el teclado estándar genera el makecode 0xE0 0x49 para la
tecla [PgUp], a la que según la tabla, corresponde un keycode 104. Pero es posible hacer que la rutina de teclado
genere el keycode 112 para esta tecla mediante la instrucción
setkeycodes e049 112
Esta transformación de scancodes en keycodes es conocida como "keybinding". A partir de aquí, el tratamiento de este keycode puede realizarse como se expone en el resto del capítulo.
Recordemos que es posible inspeccionar los keycodes producidos por las teclas mediante el comando showkey
-k
, y que las tablas anteriores pueden obtenerse mediante la utilidad getkeycodes
(necesita
privilegios adecuados).
§3 Modos de operación de la consola
Una consola es el dispositivo por el que el kernel puede mostrar sus mensajes y el usuario puede actuar sobre él para controlar el sistema en los momentos iniciales de carga. Cuando el Sistema ha terminado su carga, una misma pantalla puede ser utilizada por diversas consolas o terminales virtuales (abreviadamente VCs o VTs). El usuario puede conmutar de una a otra a voluntad; pueden ser utilizadas como si fuesen dispositivos distintos, incluso para ejecutar aplicaciones distintas.
Nota: Generalmente se puede conmutar de terminal con Ctrl+
Alt+Fn y Alt+flecha
derecha/izquierda. El comando deallocvt
desactiva todas las consolas virtuales inactivas.
§3.1 El controlador de consolas Linux tienen varios modos de operación que modifican el tratamiento del teclado en el sentido que transforman los caracteres enviados y recibidos por el terminal. Son los siguientes:
- Directo (RAW) o Scan mode. El controlador de teclado traslada los scancodes a la aplicación tal cual se reciben.
- Semidirecto (MEDIUMRAW) o Keyce mode. Los scancodes son convertidos en keycodes por el servicio de teclado según lo expuesto en el epígrafe anterior (§2).
- Traducido (XLATE) o ASCII mode. Es el modo tradicional por defecto; usa un juego de caracteres de 8 bits. Los scancodes son transformados en keycodes como en el caso anterior. A continuación los keycodes son procesados según las directrices de una tabla (mapa del teclado ) que los transforma en caracteres, secuencias de caracteres, o ejecutan alguna acción.
- UTF-8 (UNICODE). Utiliza un juego de caracteres de 16 bits que son transmitidos al kernel como secuencias de 1 o 2 bits según la especificación UNICODE (recordar que este sistema es multibyte).
El modo está determinado por la variable TERM
. Su valor puede ser consultado mediante
printenv TERM
y puede ser establecido mediante la utilidad kdb_mode
.
Nota: TERM
adopta el valor linux cuando está en modo tradicional (por defecto)
y xterm
(terminal X) cuando actúa en modo gráfico. El sistema X Window dispone
de su propio controlador de teclado, de forma que la consola utiliza en este
caso el modo RAW (es el entorno gráfico el encargado de controlar el teclado).
La tecla Alt es conocida como meta tecla ("Meta key") y la combinación de cualquier
tecla X con ella Alt + X, se abrevia como Alt-X o
MetaX. El tratamiento de las pulsaciones MetaX puede ser distinto para cada VC en base a un valor que puede ser
establecido mediante setmetamode
. Caben dos posibilidades al respecto:
- Generar la secuencia de caracteres ESC X (ESC = 1Bh).
- Generar un carácter equivalente a X sumándole 128 (80h). Es decir, poniendo a 1 el bit 7 de X. Recuerde que los makecodes de las teclas normales son valores por debajo de 127 (7Fh).
§3.2 Modelo de terminal
Tradicionalmente los sistemas UNIX eran accedidos mediante terminales, que consistían básicamente en un display y un teclado. Antes que se popularizaran las pantallas CRT, el terminal podía ser un teletipo (un artefacto que disponía de un teclado y un dispositivo de impresión parecido a una máquina de escribir eléctrica), de forma que lo que hoy vemos en pantalla, aparecía impreso en un rollo de papel continuo. La situación común era que un mismo sistema podía tener conectados distintos modelos de terminal, cada uno con una configuración de teclado y capacidades gráficas diferentes. Para facilitar la conexión, podía decirse al sistema que modelo de terminal se estaba utilizando, de forma que supiese el significado de determinadas teclas y como debía enviar las respuestas. Linux ha heredado muchas características de UNIX, de forma que permite utilizar distintos tipos de terminal.
Nota: Incluso el usuario que ejecuta Linux en su PC a través de la única pantalla y teclado existentes en el sistema, aparece frente al kernel como conectado mediante un tipo específico de terminal.
El funcionamiento se basa en que el Sistema conoce de forma pormenorizada las características y posibilidades de cada modelo de terminal y actúa en consecuencia. La información está contenida en una base de datos compuesta por ficheros, uno por cada modelo. Cada fichero contiene una larga serie de detalles, comenzando por el nombre del terminal y otros alias con los que puede ser identificado. Por ejemplo, el fichero del terminal VT100 comienza:
, vt100|vt100-am|dec vt100 (w/advanced video) .......
La base de datos, conocida genéricamente como terminfo, se encuentra en
/usr/share/terminfo/.
Para facilitar al sistema la búsqueda del fichero correspondiente a
un terminal determinado, es una estructura de directorios, donde el nombre de
cada directorio es la letra, o cifra, inicial de los ficheros que contiene. Consulte el manual term
para más detalles, man term
, sobre la organización de estos ficheros. La estructura interna está detallada
en el manual terminfo. Ver man terminfo
Existen diversas utilidades que permiten inspeccionar o cambiar aspectos del terminal utilizado (consulte los manuales correspondientes).
- stty. Inspeccionar y fijar las características de las terminales de impresión.
- setterm. Fijar los atributos del terminal. Cuando se invoca sin argumentos, muestra una relación de todas las características del terminal en uso que pueden ser modificados (estas características corresponden a las que se han definido en el fichero terminfo correspondiente). La página adjunta muestra un ejemplo del tipo de reglajes que pueden efectuarse en la consola de un PC estándar ( setterm).
- tput. Inicializar el terminal o interrogar sus características (valores en terminfo).
§4 Configuración del teclado
De acuerdo con la especificación LBS ("Linux Standar Base"), los scripts que controlan el inicio del sistema, están en /etc/init.d/. Estos scripts son ejecutados, directa o indirectamente, por /sbin/init, que es el padre de todos los procesos y cuya configuración está en /etc/inittab.
/sbin/init ejecuta algunos script de inicialización de hardware situados en /etc/init.d/boot.d/, que proceden a la inicialización de puertos serie, tarjetas de red, reloj de tiempo real (CMOS), volúmenes lógicos, Etc. Finalmente invoca el script /etc/init.d/boot.local, que contiene cualquier orden adicional.
En lo que respecta al teclado, el script /etc/sysconfig/keyboard contiene los parámetros de configuración para la consola en modo texto ("Text console"). A continuación se muestra un extracto del referido script con los argumentos más significativos (conservamos los comentarios originales en inglés).
# Keyboard settings for the text console
#
# Keyboard mapping (/usr/share/kbd/keymaps/)
# e.g. KEYTABLE="de-latin1-nodeadkeys", "us" or empty for US settings
#
KEYTABLE="es.map.gz"
# Keyboard repeat rate (2.0 - 30.0)
# Keyboard delay time in ms (250, 500, 750, 1000)
# (If you want "kbdrate" to be executed, you have to set both of them.)
KBD_RATE=""
## Type: integer
## Default:
KBD_DELAY=""
## Type: list(bios,yes,no)
## Default: bios
# NumLock on? ("yes" or "no" or empty or "bios" for BIOS setting)
KBD_NUMLOCK="bios"
## Type: yesno
## Default: no
# ScrollLock on? ("yes" or "no")
KBD_SCRLOCK="no"
## Type: yesno
## Default: no
# CapsLock on? ("yes" or "no")
KBD_CAPSLOCK="no"
## Type: yesno
## Default: no
# Disable CAPS LOCK and make it a normal Shift key?
# (Ctrl Caps Lock will still toggle Caps Lock functionality)
KBD_DISABLE_CAPS_LOCK="no"
A efectos del comportamiento del teclado, es fundamental la línea
KEYTABLE="es.map.gz
que define el fichero que contiene el mapa del teclado ("Keymap"). Esta tabla asocia cada keycode con una acción determinada. Generalmente la "acción" se refiere al carácter, o combinación de ellos, que generará el controlador de teclado, pero no tiene que ser así necesariamente. Es posible configurar una tecla para que ejecute una aplicación cualquiera al ser pulsada (incluso apagar el sistema, enviar un e-mail, Etc). Como puede verse, el resto de líneas del script controlan otros aspectos del comportamiento del teclado.
El comportamiento inicial puede ser modificado mediante el referido escript. Posteriormente puede ser inspeccionado y modificado en runtime mediante varias utilidades:
- showkey. Esta utilidad ya ha sido comentada anteriormente ( 7.1.1); sirve para verificar los códigos de exploración generados por el teclado (opción -s) o los keycodes devueltos por la interrupción 9 (opción -k).
- loadkeys. Permite cambiar el mapa del teclado de las consolas. Requiere privilegios especiales, pero puede ser potencialmente peligroso, porque el cambio afecta a todas las consolas virtuales, incluyendo la de inicio, con lo que puede verse afectado el proceso de acceso. Consulte el manual antes de efectuar ningún cambio.
- dumpkeys. Permite inspeccionar el "Keymap" que está utilizando el controlador del teclado y otra información relacionada.
- kbdrate. Pemite modificar la velocidad de repetición y el retardo inicial. Generalmente los valores por defecto corresponden al estándar inicial IBM: 10 caracteres por segundo y 250 milisegundos respectivamente.
§5 El mapa del teclado
La tabla ("Keymap") inicial depende de las opciones de compilación del Sistema. En concreto, del lenguaje adoptado para el teclado y del idioma. Generalmente existe una configuración por defecto /etc/defkeymap.map [1] y ficheros de definición para distintos idiomas en /usr/share/kbd/keymaps/. Como hemos visto, la variable KEYTABLE del fichero /etc/sysconfig/keyboard determina cual de ellas será cargada por el Kernel.
Los mapas de teclado son ficheros de texto con información de lo que hace cada tecla mediante una simbología y sintaxis particular que puede ser consultada en man keymaps. Contienen siete tipos de líneas:
- Definiciones de teclas
- Includes
- Especificación
- Comentarios
- Definiciones de juegos de caracteres
- Definición de cadena
- Definición de composición .
Las líneas de un mismo grupo definen una especie de sub-tabla dentro del conjunto, que se refiere a aspectos específicos. Por ejemplo, la tabla de acentos , que describe la forma en que se utilizan los signos diacríticos y caracteres compuestos, o la tabla de funciones , que describe los códigos que se generarán en cada acción.
§5.1 Definiciones de teclas ("Keycode definitions"). La definición completa de cada tecla está contenida en una de estas líneas, aunque pueden tener prolongación en la siguiente incluyendo un carácter \ al final. Adoptan la siguiente sintaxis:
keycode keynumber = keysym keysym keysym ...
Ejemplos:
keycode 6 = five percent currency
keycode 10 = nine parentleft bracketright
keycode 16 = bracketleft braceleft
keycode 30 = +a
keycode 39 = semicolon colon
keycode 61 = F3 F15 console_15
keycode 111 = Remove
altgr control keycode 111 = Boot
control alt keycode 111 = Boot
El significado es el siguiente:
keycode
Palabra clave que inicia cada definición. Las
palabras que la preceden en algunos casos (dos últimas líneas) son
modificadores que señalan el comportamiento cuando actúan las teclas de conmutación.
keynumber
es un número interno de identificación de la tecla. Puede ser indicado en decimal
(nn), octal (0nn) o hexadecimal (0xnn). Cinciden aproximadamente con el código de exploración
(makecode
7.1.1), pero la mejor manera de verificar
el valor que corresponde a una tecla determinada es utilizar la utilidad showkey -k.
keysym
son códigos numéricos (hexadecimal) que representa acciones,
aunque no suelen utilizarse como tales, sino mediante constante simbólicas
equivalentes. La razón es que los códigos varían según la versión
del Kernel, mientas que las constantes simbólicas se mantienen entre versiones.
Las equivalencias son del siguiente tenor:
0x0000 nul 0x0009 tab 0x0020 space 0x0035 five 0x0041 A 0x0061 a |
0x007b braceleft 0x0116 Remove 0x020c Boot ... |
Nota: Puede obtenerse una tabla de equivalencias mediante el comando
dumpkeys --long-info
. En la página adjunta se muestra un listado correspondiente a un kernel 2.4.21-99
(
Constantes simbólicas).
Las acciones pueden consistir en generar códigos de carácter o secuencias de caracteres, cambiar de consola, cambiar el keymap o incluso reiniciar el sistema. Pueden definirse hasta 256 acciones distintas a cada tecla, que corresponden a la acción de hasta 8 posibles modificadores, que pueden estar presentes o no, cuando se pulsa la tecla . A cada una de estas posibilidades le corresponde un valor, desde 0 (ausencia de modificadores) a 255 (actuación simultanea de todos). Se supone que cada modificador le corresponde un peso según su posición en un octeto hipotético (ver a continuación ).
Generalmente estos códigos de acción están relacionados con las teclas de edición (representables) y de función del teclado, y están definidos de forma que la pulsación de una tecla genere la secuencia estándar de códigos. En la página adjunta se muestra el mapa de teclado por defecto de un sistema ( Mapa de teclado)
Nota: el comando dumpkeys -i
ofrece un resumen de las posibilidades al respecto
(
Dumpkeys).
altgr - [Alt] derecha |
§5.1a Modificadores
La acción correspondiente a la pulsación de una tecla depende del estado de los bytes de estado ( 7.1.1) en ese momento. Aquí se denominan modificadores; se consideran 8, y se les han asignado unos nombres y un "Peso" en forma de potencia de dos, según la tabla adjunta.
La acción a tomar se obtiene sumando los pesos de los modificadores que actúen en ese momento. Por ejemplo, si están accionados los modificadores Shift y Alt, el peso total es 9, y se toma la acción indicada en la columna 10 la línea de definición . Por defecto, cuando no está accionado ningún modificador, el peso total es 0, y la acción correspondiente es la indicada por el keysym de la primera columna.
Cada keysym puede ser precedido del signo +, en cuyo caso es tratado como una letra, por consiguiente, será afectado por la acción de las teclas Caps Lock y Shift. Ejemplo:
keycode 30 = +a
Por defecto, los caracteres ASCII 'a'-'z' y 'A'-'Z' gozan de esta consideración de "letras", y por tanto, se ven afectados por las mayúsculas. Si se desea que la combinación Shift+Caps Lock no produzca una letra minúscula al pulsar la A, la línea de definición correspondiente es:
keycode 30 = +a A
§5.1b La ausencia de acción se indica con la palabra clave VoidSymbol. Por ejemplo, si se desea que la tecla A, produzca una "a" en ausencia de modificadores, y nada si se pulsa junto a Caps Lock o Shift, se utilizará la siguiente definición:
keycode 30 = a VoidSymbol
Por simplicidad se admite que los VoidSymbol al final de una definición pueden omitirse. Por ejemplo, para señalar que la tecla A producirá una "a" cuando se pulsa aislada; una "A" cuando se pulse con alguna de las teclas de mayúsculas, y nada en los demás casos, puede utilizarse la definición
keycode 30 = a A
en vez de
keycode 30 = a A VoidSymbol VoidSymbil VoidSymbol ...
Además de la anterior, existen otras dos reglas que ayudan a simplificar la sintaxis de las definiciones:
§5.1c Si en una definición existe un solo código de acción keysym a la derecha del signo igual, y no es una letra ASCII ( ASCII 'a'-'z' o 'A'-'Z' ), se supone que el código de acción se replica en cada una de las columnas definicas. Ejemplo, las líneas que siguen son equivalentes:
keycode 28 = Return
keycode 28 = Return Return Return Return ...
§5.2 Includes: Indican la inclusión de otro fichero de definición. Tienen la forma:
include "pathname"
§5.3 Especificación. El mapa del teclado debe estar precedido de una línea de especificación que indica las columnas que se especifican en él. Los números de columna corresponden a los pesos de la tabla de modificadores y sus posibles combinaciones . Por ejemplo, la especificación:
keymaps 0-2,4-5,8,12
es equivalente a
keymaps 0,1,2,4,5,8,12
y señala que no serán especificadas las 256 columnas posibles, sino 7: Normal (0 = sin modificador "Plain key"); Shift (1); AltGr (2); Control (4); Control+Shift (5 = 4+1); Alt (8) y Control+Alt (12 = 8+4). A su vez la especificación
keymaps 0-2,4,6,8-9,12
indica que serán especificadas las columnas: Normal; Shift; AltGr; Control; AltGr+Control; Alt; Shift+Alt y Control+Alt. En caso de faltar esta línea, se supone keymaps 0-M, donde M+1 es el máximo número de entradas encontrada en cualquier línea de definición.
§5.4 Comentarios: Comienzan con ! o # y se prolongan hasta el final de la línea.
§5.5 Definiciones de juegos de caracteres ("Charset definitions") Indican la forma en que se interpretan los códigos de acción keysyms que siguen a la definición (a qué página de códigos corresponden). Es una línea del tipo:
charset "iso-8859-2"
Por ejemplo, en el juego de caracteres ISO-8859-1, denominado Latin-1, al símbolo mu o micro (µ) le corresponde el código 181, mientras que en el ISO-8859-7 (alfabeto griego) le corresponde el 236. Por defecto se supone que la página utilizada es la ISO-8859-1.
string F1 = "\033[[A" string F2 = "\033[[B" string F3 = "\033[[C" string F4 = "\033[[D" string F5 = "\033[[E" string F6 = "\033[17~" string F7 = "\033[18~" string F8 = "\033[19~" string F9 = "\033[20~" string F10 = "\033[21~" string F11 = "\033[23~" string F12 = "\033[24~" string F13 = "\033[25~" string F14 = "\033[26~" string F15 = "\033[28~" string F16 = "\033[29~" string F17 = "\033[31~" string F18 = "\033[32~" string F19 = "\033[33~" string F20 = "\033[34~" string Find = "\033[1~" string Insert = "\033[2~" string Remove = "\033[3~" string Select = "\033[4~" string Prior = "\033[5~" string Next = "\033[6~" string Macro = "\033[M" string Pause = "\033[P" |
§5.6 Definiciones de cadena ("String definitions").
Cuando los códigos de acción keysym se refieren a caracteres, su acción está perfectamente definida por su valor numérico (si esta es la forma utilizada), o por la constante manifiesta y la indicación de la tabla de códigos que se utiliza para su traducción . Por ejemplo:
charset "iso-8859-2"
...
keycode 39 = semicolon colon
En este contexto, la definición de código de exploración 39 es inequívoca. Pero en el caso de teclas de función y especiales, que pueden generar una cadena de caracteres y que no tienen cabida en las páginas de códigos ISO, se utiliza un método indirecto; las definiciones de cadena, que permiten indicar que código/s generarán tales teclas. Utilizan la siguiente sintaxis:
string keysym = "text"
Con el siguiente significado:
-
string
Palabra clave que inicia cada definición de cadena -
keysym
Código de acción de la tecla de función o especial (ver tabla) -
text
Una cadena alfanumérica entre comillas. Puede contener caracteres literales ; octales, en forma barra invertida \ seguida de hasta tres dígitos (octales), o las secuencias de escape \n; \\ y \" (E3.2.3e).
Nota: Observe que todas las entradas de la tabla a la derecha, generan en primer lugar un carácter Escape (\033 octal = 27d).
Ejemplo:
string F1 = "Hola!"
string F13 = "Adios!"
De esta forma, la línea de definición del tipo
keycode 59 = F1 F13
tiene un significado perfectamente definido (aunque inusual).
Precisamente debido a su uso, el conjunto de líneas de este tipo constituye la denominada tabla
de funciones ("Functions table"). Tiene el aspecto indicado a la derecha (valores por defecto en
un Sistema real) y puede obtenerse mediante el comando dumpkeys --funcs-only
.
El ejemplo que sigue utiliza la constante F100, generalmente no utilizada
(
Constantes simbólicas)
para hacer que la combinación Alt-izq+ { ] produzca la secuancia
{...}
.
alt keycode 26 = F100
string F100 = "{...}"
§5.7 Definición de composición
Estas líneas presentan la siguiente sintaxis:
compose 'char1' 'char2' to 'char3'
Ejemplo:
compose '~' 'N' to 'Ñ'
compose '~' 'n' to 'ñ'
compose
y to
son palabras clave. Describen la forma en que dos caracteres, char1
y char2, se combinan para formar un tercero char3. Lo que
permite definir caracteres con signos diacríticos y compuestos [3].
Quizás por esta razón, el conjunto de estas líneas constituyen la
denominada tabla de acentos ("Accent table"). Por defecto contiene 68
entradas, que pueden obtenerse mediante el comando dumpkey --compose-only
. La página
adjunta muestra su aspecto (
Tabla de acentos).
[1] La tabla por defecto utiliza unas definiciones para las teclas de función inspiradas en el terminal VT100. Aunque obsoleto, este terminal es considerado un estándar. Las siglas corresponden a un modelo DEC (Digital Equipment Corporation). En realidad una pantalla y un teclado, que podían conectarse mediante línea serie, en bucle de tensión (RS-232/V24) o de corriente (20 mA), a velocidades de 75 a 19200 bps mediante un protocolo software XON/XOFF. El conjunto, innovador para la época, estaba controlado por un micro Intel 8085 y podía emular a los anteriores modelos VT05, VT50 y VT52 del fabricante.
Durante mucho tiempo fue uno de los terminales más populares para acceder a los ordenadores de su tiempo (finales de los 70). Disponía de una pantalla CRT de 12" y 24 x 80 caracteres de 7x9 pixels. Podía manejar el juego US-ASCII de 128 códigos, y un teclado estándar de 65 teclas, similar a los actuales, con un teclado auxiliar de 18 teclas con dígitos, flechas y teclas de función.
[3] Diacríticos: signos que se utilizan junto a algunas letras para darles un significado especial. Por ejemplo, la diéresis sobre la "u" en vergüenza. Por su parte, los caracteres compuestos están formados por dos caracteres simples. Por ejemplo, la eñe (ñ) española está formada por la ene (n) y la tilde ~.