答え1
見るキーボード入力とテキスト出力はどのように機能しますか?トピックの概要については、アプリケーションがターミナルで実行されているか、GUI 環境と直接通信しているかによって異なります。
端末では、端末ソフトウェア(今世紀では一般的に端末エミュレータ)が文字のエンコードを決定します。文字エンコード(入力と出力で同じ)は、ロケール環境変数LC_CTYPE
。この変数が設定されていないか に設定されている場合C
、端末は情報を提供しないため、アプリケーションはエンコードが何であるかを知ることができません。端末では、文字は文字としてアプリケーションに送信されます。文字以外の入力(ファンクションキー、カーソルキー、 などの修飾子が付いたキーAltなど)は、エスケープシーケンス(そのうちのいくつかは制御文字その代わり)。
X11アプリケーションは次のような形式で入力を受け取りますKeyPressイベントKeyPressイベントには低レベルの指示(keycode
キーの物理的な位置にほぼ対応し、state
アクティブな修飾子をエンコードする)が含まれます。アプリケーションは次のような関数を呼び出すことができます。XLookupString
(従来の機能、ラテン語1に限定)またはXmbLookupString
(他のユニバイトエンコーディングをサポートする関数)またはXwcLookupString
(マルチバイトエンコーディングをサポートする関数)またはXutf8LookupString
(最新の UTF-8 関数) を使用して、この生の情報を文字列に変換します。
キーから文字へのマッピングはさまざまなレベルで変更できます。キーボード入力とテキスト出力はどのように機能しますか?概要があります。
答え2
キーボードは文字を送信しません。スキャン コードを送信します。たとえば、一般的な米国キーボードで「e」というラベルの付いたキーを押すと、基本的に「メイン グループの英数字キーの 2 列目の左から 3 番目のキー」を示すスキャン コードが送信されます。このスキャン コードは、カーネル (またはオペレーティング システムの他のコンポーネント) によって文字に変換されます (または一般にキー シンボルに変換されます。「Print Screen」などのキーを考えてください)。特に Linux では、グラフィカル サブシステムによって変換される可能性があります。
通常、オペレーティング システムまたはグラフィカル サブシステムは、変換テーブルを制御する 1 つ以上のユーティリティを提供します。たとえば、Windows と Linux の両方で、必要な数のキーボード レイアウトをインストールし、簡単に切り替えることができます。
アプリケーションが取得するものは、オペレーティング システムの規則によって異なります。Windows では、コンソール アプリケーションは、コマンドによって設定された現在のコンソール コード ページに従ってエンコードされた文字を取得しますchcp
。グラフィカル アプリケーションは、通常 UTF-16 エンコードされた文字に変換されるキー シンボルを取得します。Linux では、アプリケーションは通常 UTF-8 エンコードされた文字を取得します。たとえば、ă
キーボード レイアウトが正しく設定されている状態で (LATIN SMALL LETTER A WITH BREVE、U+0103) というラベルのキーを押すと、
- Windows 上のコンソール アプリケーションは
chcp 1250
1 バイト (10 進数で 227) を取得します'\xE3'
。 - Windows 上のコンソール アプリケーションは
chcp 852
1 バイト (10 進数で 199) を取得します'\xC7'
。 '\x03'
'\x01'
Windows 上のグラフィカル アプリケーションは適切なキー シンボルを取得し、通常は 2 バイト(または short 整数)として保存/処理されます0x103
。- Linux 上のターミナル アプリケーションは 2 バイト
'\xC4'
'\x83'
(UTF-8 エンコードでは <U+0103>) を取得します。 '\xC4'
'\x83'
Linux 上のグラフィカル アプリケーションは適切なキー シンボルを取得し、通常は 2 バイト(UTF-8 エンコードでは <U+0103>)として保存/処理されます。
(ここで言う Windows とは、Windows NT とその後継である Windows XP、Windows Vista、7、10 を指します。Windows 95 などはまったく異なるオペレーティング システムであり、ありがたいことに現在は使用されていません。)
Vim では、翻訳の新しいレイヤーが 2 つあります。
キーボード変換マップは を使用してインストールできます。および を
set keymap
参照してください。これは、オペレーティング システム レベルでキーボード レイアウトをインストールできないシステムで、目的の言語でテキストを入力するのに役立ちます。:help 'keymap'
:help mbyte-keymap
コマンドを使用してマッピングを定義できます
:map
。 を参照してください:help :map
。