Кодировка ввода с клавиатуры

Кодировка ввода с клавиатуры

Я пытаюсь изучить основы Unicode и UTF-8, и пока все идет очень гладко. Я знаю, что можно выбрать кодировку файла при его открытии.

Когда я набираю текст с помощью клавиатуры в текстовом редакторе (GeditилиВим) или командной строки, какая кодировка отправляется клавиатурой в приложение? Отличается ли она на машинах Windows? Можно ли ее настроить?

решение1

ВидетьКак работает ввод с клавиатуры и вывод текста?для обзора темы. Это зависит от того, запущено ли приложение в терминале или напрямую взаимодействует со средой GUI.

В терминале терминальное программное обеспечение (обычно эмулятор терминала в этом столетии) определяет кодировку символов. Оно передает кодировку символов (одинаковую для ввода и вывода) путем установкилокальпеременная окружения LC_CTYPE. Если эта переменная не установлена ​​или установлена ​​в C, терминал не предоставляет никакой информации, поэтому приложение не может знать, какая кодировка. В терминале символы отправляются в приложение как символы; несимвольный ввод (функциональные клавиши, клавиши курсора, клавиши с модификаторами, такими как Alt, и т. д.) отправляется какпоследовательности выхода(некоторые из них какуправляющие символывместо).

Х11приложения получают входные данные в формеСобытия KeyPress. События KeyPresss содержат низкоуровневую индикацию ( keycodeкоторая примерно соответствует физическому расположению клавиши и stateкоторая кодирует активные модификаторы). Приложение может вызвать функцию, напримерXLookupString(традиционная функция, ограниченная Latin-1) илиXmbLookupString(функция, поддерживающая другие однобайтовые кодировки) илиXwcLookupString(функция, поддерживающая многобайтовые кодировки) илиXutf8LookupString(современная функция UTF-8) для преобразования этой необработанной информации в строку символов.

Сопоставление клавиш с символами можно изменять на разных уровнях;Как работает ввод с клавиатуры и вывод текста?имеет обзор.

решение2

Клавиатура не отправляет символы; она отправляет скан-коды. Например, когда вы нажимаете клавишу с надписью "e" на типичной американской клавиатуре, она отправляет скан-код, который по сути говорит "3-я клавиша слева на 2-м ряду буквенно-цифровых клавиш в основной группе". Этот скан-код преобразуется в символ (или, в общем, в символ клавиши, представьте себе такие клавиши, как "Print Screen") ядром (или каким-либо другим компонентом операционной системы) и, в частности, в Linux, возможно, графической подсистемой.

Обычно операционная система или графическая подсистема предоставляют одну или несколько утилит, которые управляют таблицами преобразования; например, как в Windows, так и в Linux вы можете установить столько раскладок клавиатуры, сколько захотите, и легко переключаться между ними.

То, что получает приложение, зависит от соглашений операционной системы. В Windows консольные приложения получают символ, закодированный в соответствии с текущей кодовой страницей консоли, установленной командой chcp; графические приложения получают символ клавиши, который обычно преобразуется в символ в кодировке UTF-16. В Linux приложения обычно получают символ в кодировке UTF-8. Например, если я нажму клавишу с надписью ă(ЛАТИНСКАЯ СТРОЧНАЯ БУКВА A С КРАТКИМ НАЗВАНИЕМ, U+0103) при правильно установленной раскладке клавиатуры,

  • Консольное приложение в Windows chcp 1250получит один байт '\xE3'(227 в десятичной системе).
  • Консольное приложение в Windows chcp 852получит один байт '\xC7'(199 в десятичной системе).
  • Графическое приложение в Windows получит подходящий символ ключа, который обычно сохраняется/обрабатывается как два байта '\x03' '\x01'(или как короткое целое число 0x103).
  • Терминальное приложение в Linux получит два байта '\xC4' '\x83'(<U+0103> в кодировке UTF-8).
  • Графическое приложение в Linux получит подходящий символ ключа, который обычно сохраняется/обрабатывается как два байта '\xC4' '\x83'(<U+0103> в кодировке UTF-8).

(Обратите внимание, что под Windows я подразумеваю Windows NT и ее преемников, таких как Windows XP, Windows Vista, 7 или 10. Windows 95 и т. д. — это совершенно другая линейка операционных систем, к счастью, больше не используемая.)

В Vim вы получаете два новых уровня перевода:

  • Вы можете установить карту перевода клавиатуры с помощью set keymap; см. :help 'keymap'и :help mbyte-keymap. Это помогает вводить текст на нужном языке в системах, где вы не можете установить раскладку клавиатуры на уровне операционной системы.

  • Вы можете определить сопоставление с помощью :mapкоманды. См :help :map. .

Связанный контент