Estoy tratando de aprender los conceptos básicos de Unicode y UTF-8, y hasta ahora todo va muy bien. Sé que es posible elegir la codificación de un archivo al abrirlo.
Cuando escribo texto usando el teclado en un editor de texto (GeditoEmpuje) o un símbolo del sistema, ¿cuál es la codificación que envía el teclado a la aplicación? ¿Es diferente en las máquinas con Windows? ¿Se puede configurar?
Respuesta1
Ver¿Cómo funcionan la entrada y salida de texto por teclado?para una visión general del tema. Depende de si la aplicación se ejecuta en una terminal o se comunica directamente con el entorno GUI.
En una terminal, el software de la terminal (generalmente un emulador de terminal en este siglo) determina la codificación de los caracteres. Transmite la codificación de caracteres (la misma para entrada y salida) configurando ellugarVariable ambiental LC_CTYPE
. Si esta variable no está configurada o está configurada en C
, el terminal no proporciona ninguna información, por lo que la aplicación no puede saber cuál es la codificación. En una terminal, los caracteres se envían a la aplicación como caracteres; La entrada sin caracteres (teclas de función, teclas de cursor, teclas con modificadores como Alt, etc.) se envía comosecuencias de escape(algunos de ellos comopersonajes de controlen cambio).
X11Las aplicaciones reciben información en forma deEventos de KeyPress. Los eventos KeyPresss contienen una indicación de bajo nivel ( keycode
que corresponde aproximadamente a la ubicación física de la tecla y state
que codifica los modificadores activos). La aplicación puede llamar a una función comoXLookupString
(función tradicional, limitada a Latin-1) oXmbLookupString
(función que admite otras codificaciones unibyte) oXwcLookupString
(función que admite codificaciones multibyte) oXutf8LookupString
(función UTF-8 moderna) para convertir esta información sin procesar en una cadena de caracteres.
La asignación de claves a personajes se puede cambiar en varios niveles;¿Cómo funcionan la entrada y salida de texto por teclado?tiene una visión general.
Respuesta2
El teclado no envía caracteres; envía códigos de escaneo. Por ejemplo, cuando presiona la tecla etiquetada "e" en un teclado americano típico, se envía un código de escaneo que esencialmente dice "tercera tecla desde la izquierda en la segunda fila de teclas alfanuméricas del grupo principal". Este código de escaneo se convierte en un carácter (o en general en un símbolo de clave, piense en teclas como "Imprimir pantalla") por el núcleo (o algún otro componente del sistema operativo) y, específicamente en Linux, posiblemente por el código gráfico. subsistema.
Generalmente el sistema operativo o el subsistema gráfico proporciona una o más utilidades que controlan las tablas de conversión; por ejemplo, tanto en Windows como en Linux puedes instalar tantas distribuciones de teclado como quieras y cambiar entre ellas con facilidad.
Lo que obtiene la aplicación depende de las convenciones del sistema operativo. En Windows, las aplicaciones de consola obtienen un carácter codificado de acuerdo con la página de códigos de consola actual establecida por el comando chcp
; las aplicaciones gráficas obtienen un símbolo de clave que generalmente se traduce a un carácter codificado en UTF-16. En Linux, las aplicaciones suelen obtener un carácter codificado en UTF-8. Por ejemplo, si presiono la tecla etiquetada ă
(LETRA A MINÚSCULA LATINA CON BREVE, U+0103) con la distribución del teclado configurada correctamente,
- Una aplicación de consola en Windows
chcp 1250
obtendrá un byte'\xE3'
(227 decimal). - Una aplicación de consola en Windows
chcp 852
obtendrá un byte'\xC7'
(199 decimal). - Una aplicación gráfica en Windows obtendrá un símbolo de clave adecuado, que normalmente se almacenará/procesará como dos bytes
'\x03'
'\x01'
(o como un entero corto0x103
). - Una aplicación de terminal en Linux obtendrá dos bytes
'\xC4'
'\x83'
(<U+0103> en codificación UTF-8). - Una aplicación gráfica en Linux obtendrá un símbolo de clave adecuado, que normalmente se almacenará/procesará como dos bytes
'\xC4'
'\x83'
(<U+0103> en codificación UTF-8).
(Tenga en cuenta que por Windows me refiero a Windows NT y sus sucesores, como Windows XP, Windows Vista, 7 o 10. Windows 95, etc. son una línea completamente diferente de sistemas operativos, afortunadamente ya no se utilizan).
En Vim obtienes dos nuevas capas de traducción:
Puedes instalar un mapa de traducción de teclado con
set keymap
; ver:help 'keymap'
y:help mbyte-keymap
. Esto ayuda a ingresar texto en el idioma deseado en sistemas donde no se puede instalar una distribución de teclado a nivel del sistema operativo.Puede definir un mapeo con el
:map
comando. Ver:help :map
.