アプリケーションが入力文字を取得しようとしています。

アプリケーションが入力文字を取得しようとしています。

一部の言語には広い文字があります。ワイド文字は複数のバイトを持つことができます。コンソールまたはXにワイド文字を入力すると、実際に数バイトを送信します。シングルバイト文字は、送信、受信されない、または受信または受信されないという意味で、それ自体が原子的です。しかし、ワイド文字の場合はそうではありません。たとえば、3バイト文字の最初のバイトのみを送信すると、ガベージが生成されます。基本システムは、アプリケーションが常に自動的にワイド文字を受信することをどのように保証しますか?良い答えは、ユーザーがコンソール、X、SSHでそれぞれワイド文字を入力したときに何が起こるかを説明する必要があります。スタートストーリー:ユーザーがワイド文字を入力すると割り込みが発生します。


基本システムは、アプリケーションが常に自動的にワイド文字を受信することをどのように保証しますか?

スタックに複数のレイヤーがあるため、この質問の用語は一部の人にとって混乱する可能性があります。私が実際に意味するものは次のとおりです。編集ボックス付きのGUIアプリケーションを作成すると思います。ワイド文字を入力すると、完全に表示または表示されず、部分的には表示されません。したがって、基本システムには、アプリケーションの下のすべての項目(この場合はアプリケーションフレームワーク、GUIライブラリなど)が含まれます。

答え1

そうではありません。

(テキスト)アプリケーションは標準入力からバイトストリームを受け取ります。このアプリを使えば、好きなだけ多くのコンテンツを読むことができます。呼び出しはread要求されたバイトよりも少ないバイトを自由に返します。このバイトストリームは必要に応じて解釈できます。、より多くのバイトの読み取りを要求するか、すべてを不透明なバイナリデータとして処理します。特定のバイトを別の個々のブロックの一部として解釈したい場合は、そうすることができ、ブロックを所有していると判断するまで検索を続けることができます。一度にすべてを得ることができるという保証はありません。バイトでない限り。

ここに短い答えがあります。必要に応じて今読む必要はありません。アプリケーションが選択した結果を得るために必要なすべての操作を実行できるまで、質問の前提は偽です。

以下では、物事が発生する可能性がある(または発生しない可能性がある)いくつかの方法と、誰かの観点から「原子的」である可能性がある場合と発生しない可能性がある場合について説明します。


この回答の残りの部分では、ネットワークとソケットのトラフィックを無視します。我々はまた、「役割」のやや曖昧な定義を採用します。これが出発点のように見え、今後進む可能性が高いからです。最終アプリケーションの観点から問題を検討します。最後に、キーボードハードウェアの(主にトピックから離れた)パスを簡単に見てみましょう。まだ長すぎます。


アプリケーションが入力文字を取得しようとしています。

アプリケーションにはread入力にいくつかのバイトが必要です。その後、受信したバイトを任意の方法で自由に解釈したり、ライブラリにそのようにすることもできます。テキストが必要な場合は、これらのバイトをどのように解釈します。文字エンコーディング、バイトシーケンスの意味を決定します。使用されたエンコーディングのデータソースまたは端末と一致することを願っています(ただし必須ではありません!)。すべてのエンコードと同様に、アプリケーションはオブジェクトを次のように解釈することを決定します。

  • そのエンコーディングがASCIIなら、とにかくすべてがシングルバイトなので、すべてが大丈夫です。

  • エンコーディングがUCS-2の場合、16ビットの場合、必要に応じてwchar_t別のバイトを要求できるように読み取られたバイト数を知ることをお勧めします(readいつでも奇数バイトが返される可能性があるため、コードの半分が提供されます)。単位)。

  • エンコーディングが次の場合UTF-9、コード単位を取り出すには、それ自体がいくつかの修正が必要になる可能性があり、最新のシステムでそれをアトミックに渡すことはほとんど不可能です。

  • 対応するエンコーディングがKEISの場合、シーケンスの解釈はストリーム初期のステートフルモード遷移に依存するため、予想されるレベルの原子転送もできません。アプリケーションは、この入力が何を意味するのかを知るために、すでに見たことを覚えておく必要があります。

  • エンコーディングが次の場合UTF-8今日、アプリケーションは同期にシングルバイトを使用する可能性が高いです。自己同期エンコーディングです。:シングルバイトコード単位の場合、マルチバイトシーケンスのすべての部分の上位ビットは0、上位ビットは1です。 2、3、または4バイトのコード単位の最初のバイトはそれぞれ110、1110、または11110で、後続のバイトは10から始まります。バイトを読み取ると、より多くのバイトが必要か、すでに作業中であるかがわかります。

    必要に応じてお申し込みください。それでは一つ作ってみたいかもしれませんね。第二 read次のバイトについて。どの部分要素を読み取ったかを覚えて、最後に2つの部分を組み合わせる必要があります。 3番目または4番目の読み取りが必要な場合があります。

    その後、必要に応じて個別に処理し、コードポイントに対して単一の32ビット値をエクスポートすることもできます。再利用のために関数やライブラリに抽象化するのが賢明かもしれません。

これらの属性とそれ以上の両方を持つ他のエンコーディングがあります。これらのいくつかはPOSIXではシステムエンコーディングとして許可されていませんが、アプリケーション間で合意することができます。現在、Unixファミリーシステムでマルチバイトシステムエンコーディングを使用している場合は、UTF-8の可能性が高くなります。


しかし、役割はまさに何ですか?

私のマルチバイト文字「é」はUTF-8の2バイト(C3 A9)または3バイト(65 CC 81)です。これは、単一のコードポイント(ACUTEを含むU + 00E9 LATIN SMALL LETTER E)または2バイト(U)である可能性があるためです。 +0065 ラテン小文字 E + U+0301 結合された予音)。 」

関連情報