キーボード入力のエンコード

キーボード入力のエンコード

私は Unicode と UTF-8 の基礎を学ぼうとしていますが、これまでのところ順調に進んでいます。ファイルを開くときにエンコードを選択できることは知っています。

テキストエディタでキーボードを使ってテキストを入力すると(ゲディットまたはヴィム) またはコマンド プロンプトの場合、キーボードからアプリケーションに送信されるエンコードは何ですか? Windows マシンでは異なりますか? 構成できますか?

答え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 12501 バイト (10 進数で 227) を取得します'\xE3'
  • Windows 上のコンソール アプリケーションはchcp 8521 バイト (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

関連情報