特定の文字エンコーディングを使用する場合、フォントのどのシンボルが表示されるかはどのように決定されますか?

特定の文字エンコーディングを使用する場合、フォントのどのシンボルが表示されるかはどのように決定されますか?

私は、テキストが画面に表示される仕組みの背後にある全容を理解しようとしています。物事をシンプルにするために、私はシングルバイト エンコーディング (Unicode なし) を使用します。

ディスクには、それぞれ 0 から 255 までの値を持つバイトのシーケンスがあります。次に、これらのバイトを表示するためにどの文字エンコードを使用するかをコンピュータ プログラムに指示します。ISO-8859-1 を使用すると、たとえば、値 0xA4 のバイトはドット (¤) の付いた円になります。または、ISO-8859-15 に切り替えると、値 0xA4 のバイトはユーロ記号 (€) として定義されます。

これらすべてを理解するのは簡単です。しかし、文字コードの変更と並行して、シンボルの正確な形状を定義するためにフォントを変更することもできます。フォントは、全て文字エンコーディング。したがって、フォントには ¤ と € の両方の記号が必要です。

したがって、画面にテキストを表示するための手順は明らかです。

  1. バイトシーケンスを連続して読み取る
  2. 現在のバイトの数値を使用して文字エンコードテーブルを参照します
  3. [something] を使用してフォントファイルを検索し、手順 2 で見つかったシンボルの正確な形状を取得します。
  4. フォントファイルで定義されたシンボルを描画する

ステップ 3 で、文字エンコーディングをフォントにマッピングするために使用される「何か」とは何でしょうか。フォント ファイルは文字エンコーディングに依存しますか。では、フォントには次のような「ダブル スイッチ」メカニズムが組み込まれているのでしょうか (疑似コード)

get_symbol(code, encoding) {
  switch code{
    case 0xA4: switch(encoding) {
      case 'ISO-8859-1' : return '¤';
      case 'ISO-8859-15': return '€';
    }
  }
}

?

特定のバイト シーケンスと特定の文字エンコーディングからフォントの実際のシンボルを取得する方法の詳細を教えてください。常に正しいシンボルを取得するには、どのようにマッピングすればよいですか。

答え1

フォント ファイルは、特定のエンコーディングを表示するように設計されています。特定のフォントを使用するプログラムは、n特定のエンコーディングの値が、対応するグリフ番号をレンダリングすることによって表示されるものと想定する必要がありますn

フォント ファイルには、特定の文字エンコーディングのすべての可能な値のグリフが含まれている必要はなく (Unicode の場合、フォントが全範囲をカバーすることはまれです)、エンコーディングの最初の値から始まる必要もありません (通常、制御文字は省略されます)。開始点、終了点、省略されたグリフを指定するためのさまざまなファイル形式スキームがあり、フォント ファイルのサイズを管理しやすいサイズに保つために使用されます。

示された例から、OP はおそらく X Window システムを使用していると思われます。複数のファイル形式が使用されており、それぞれ異なるアクセス方法があります。主なものは次のとおりです。XLFD(年上)とフォント設定(新しい)他のシステム(Microsoft Windows)では、他のAPIが使用されます(LOGFONT構造は良い出発点です。OSX も独自の API を持つ別の例です (コアテキスト)。

これらはもちろんグラフィカル インターフェース用です。フォントはそれよりも幅広く適用できます。たとえば、Linux と BSD では、さまざまなコンソール フォントを指定できますが、エンコーディングに加えて、使用できるグリフの数に制限があります。以下に、それらに関する便利なリンクをいくつか示します。

答え2

テキストを描画するアプリは、使用しているテキスト描画 API でフォントを指定します。指定しない場合は、システムのデフォルト フォントが使用されます。

Unicode ベースのテキスト描画システムには、指定されたフォントに要求されたグリフがない場合に、特定のグリフを含むフォントを見つけるためのフォント置換アルゴリズムが備わっていることがよくあります。しかし、Unicode 以前のシステムでは、通常、グリフを描画できなかったり、「グリフが欠落している」グリフを描画したりします。Unicode ベースのシステムでも、「グリフが欠落している」シンボルを描画することがあります。

関連情報