答案1
看键盘输入和文本输出如何工作?了解该主题的概述。这取决于应用程序是在终端中运行还是直接与 GUI 环境对话。
在终端中,终端软件(本世纪通常是终端仿真器)决定字符的编码。它通过设置来传达字符编码(输入和输出相同)语言环境环境变量LC_CTYPE
。如果此变量未设置或设置为C
,则终端不会提供任何信息,因此应用程序无法知道编码是什么。在终端中,字符作为字符发送到应用程序;非字符输入(功能键、光标键、带有修饰符的键Alt等)发送为转义序列(其中一些如控制字符反而)。
X11应用程序接收以下形式的输入按键事件。 KeyPresss 事件包含低级指示(keycode
大致对应于按键的物理位置,并对state
活动修饰符进行编码)。应用程序可以调用诸如XLookupString
(传统函数,仅限Latin-1)或XmbLookupString
(支持其他单字节编码的函数)或XwcLookupString
(支持多字节编码的函数)或Xutf8LookupString
(现代UTF-8函数)将此原始信息转换为字符串。
从按键到字符的映射可以在各个级别进行更改;键盘输入和文本输出如何工作?有一个概述。
答案2
键盘不发送字符;它发送扫描码。例如,当您在典型的美式键盘上按下标有“e”的键时,它会发送一个扫描码,其实质上是“主组中第二行字母数字键左侧的第三个键”。该扫描代码由内核(或操作系统的某些其他组件)转换为字符(或者通常转换为键符号,例如“Print Screen”之类的键),特别是在 Linux 中,可能通过图形子系统。
通常,操作系统或图形子系统提供一个或多个控制转换表的实用程序;例如,在 Windows 和 Linux 中,您都可以安装任意数量的键盘布局,并在它们之间轻松切换。
应用程序获得什么取决于操作系统的约定。在 Windows 上,控制台应用程序根据命令设置的当前控制台代码页获取编码的字符chcp
;图形应用程序会获得一个键符号,该符号通常会被转换为 UTF-16 编码字符。在 Linux 上,应用程序通常获取 UTF-8 编码的字符。例如,如果我ă
在键盘布局设置正确的情况下按标有 (LATIN SMALL LETTER A WITH BREVE, U+0103) 的键,
- Windows 上的控制台应用程序
chcp 1250
将获取一个字节'\xE3'
(十进制 227)。 - Windows 上的控制台应用程序
chcp 852
将获取一个字节'\xC7'
(十进制 199)。 - Windows 上的图形应用程序将获得一个合适的键符号,该符号通常会作为两个字节
'\x03'
'\x01'
(或短整数0x103
)进行存储/处理。 - Linux 上的终端应用程序将获得两个字节
'\xC4'
'\x83'
(UTF-8 编码中的 <U+0103>)。 - Linux 上的图形应用程序将获得一个合适的键符号,该键符号通常将以两个字节
'\xC4'
'\x83'
(UTF-8 编码中的 <U+0103>)存储/处理。
(请注意,我所说的 Windows 是指 Windows NT 及其后续版本,例如 Windows XP、Windows Vista、7 或 10。Windows 95 等是完全不同的操作系统系列,幸运的是不再使用。)
在 Vim 中你会得到两个新的翻译层:
您可以使用以下命令安装键盘翻译映射
set keymap
;参见:help 'keymap'
和:help mbyte-keymap
。这有助于在无法在操作系统级别安装键盘布局的系统上以所需语言输入文本。您可以使用该命令定义映射
:map
。看:help :map
。