Я пытаюсь изучить основы 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
. .