Wie wird bestimmt, welches Symbol einer Schrift angezeigt wird, wenn eine bestimmte Zeichencodierung verwendet wird?

462
Foo Bar

Ich versuche, die ganze Geschichte dahinter zu verstehen, wie Text auf Bildschirmen erscheint. Um es einfach zu halten, bleibe ich bei Single-Byte-Kodierungen (kein Unicode).

Auf meiner Festplatte befindet sich eine Folge von Bytes mit jeweils einem Wert zwischen 0 und 255. Ich kann meinen Computerprogrammen dann mitteilen, mit welcher Zeichencodierung diese Bytes angezeigt werden sollen. Ich könnte ISO-8859-1 verwenden, bei dem das Byte mit dem Wert 0xA4 beispielsweise ein Kreis mit Punkten ist (¤). Oder ich könnte auf ISO-8859-15 umschalten, dann ist mein Byte mit dem Wert 0xA4 als Euro-Symbol (€) definiert.

Das ist alles noch einfach zu verstehen. Parallel zur Änderung der Zeichenkodierung kann ich jedoch auch die Schriftart ändern, um die genaue Form eines Symbols zu definieren. Nun soll eine Schrift mit allen Zeichenkodierungen funktionieren . Eine Schrift sollte also beide Symbole haben: ¤ und €.

Die Schritte, um einen Text auf meinem Bildschirm anzuzeigen, sind offensichtlich:

  1. Bytefolge seriell lesen
  2. Verwenden Sie den numerischen Wert des aktuellen Bytes, um in der Zeichencodierungstabelle nachzuschlagen
  3. Verwenden Sie [etwas], um in der Schriftartdatei nachzuschlagen, um die genaue Form des Symbols in Schritt 2 zu ermitteln
  4. Zeichnen Sie das Symbol wie in der Schriftdatei definiert

Was ist das "Etwas" in Schritt 3, das zur Zuordnung der Zeichenkodierung zur Schriftart verwendet wird? Hängen Schriftdateien von der Zeichenkodierung ab? Hat also eine Schrift einen eingebauten "Doppelschalter" -Mechanismus, der wie (Pseudocode) funktioniert

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

?

Was sind die Details, wie man aus einer gegebenen Bytefolge und einer gegebenen Zeichenkodierung das eigentliche Symbol aus der Schriftart erhält? Wie wird das abgebildet, um immer das richtige Symbol zu geben?

0

2 Antworten auf die Frage

2
Thomas Dickey

Zeichensatzdateien zeigen eine bestimmte Kodierung an. Das Programm, das einen bestimmten Zeichensatz verwendet, muss davon ausgehen, dass ein Wert nin einer bestimmten Codierung angezeigt wird, indem die entsprechende Glyphennummer dargestellt wird n.

Schriftdateien brauchen keine Glyphen für alle möglichen Werte einer bestimmten Zeichenkodierung (bei Unicode ist es selten, dass eine Schrift den gesamten Bereich abdeckt), und sie müssen nicht mit dem ersten Wert der Kodierung beginnen (normalerweise werden die Steuerzeichen weggelassen). . Es gibt verschiedene Dateiformat-Schemata für die Angabe des Startpunkts, des Endpunkts und der weggelassenen Glyphen, mit denen die Schriftgrößengröße überschaubar bleibt.

Aus dem gegebenen Beispiel verwendet das OP wahrscheinlich das X-Window-System. Es wird mehr als ein Dateiformat verwendet, und auf unterschiedliche Weise wird auf sie zugegriffen. Die wichtigsten sind XLFD (älter) und fontconfig (neuer). Bei anderen Systemen (Microsoft Windows) werden andere APIs verwendet (die LOGFONTStruktur ist ein guter Ausgangspunkt). OSX ist ein weiteres Beispiel mit einer eigenen API ( CoreText ).

Die sind natürlich für grafische Schnittstellen. Schriftarten sind breiter anwendbar. Zum Beispiel erlauben Linux und die BSDs, verschiedene Konsolenschriftarten anzugeben, die neben der Kodierung Einschränkungen bei der Anzahl der verwendbaren Glyphen verursachen. Hier sind ein paar nützliche Links für diese:

0
Spiff

In der App, die den Text zeichnet, wird eine Schriftart in den verwendeten APIs für Textzeichen angegeben. Wenn dies nicht der Fall ist, wird eine Systemstandardschriftart verwendet.

Unicode-basierte Textzeichensysteme verfügen häufig über einen Algorithmus zum Ersetzen von Schriftarten, um eine Schrift zu finden, die eine bestimmte Glyphe enthält, wenn die angegebene Schrift nicht die angeforderte Glyphe enthält. Vor-Unicode-Systeme zeichnen jedoch im Allgemeinen einfach keine Glyphe oder eine "fehlende Glyphe". Sogar Unicode-basierte Systeme zeichnen manchmal ein "fehlendes Zeichen".