2010-12-04 22 views

Antwort

4

Es gibt eine sehr gute Einführung in What every developer should know about fonts.

Ich habe den Beitrag hier kopiert, aber viele der Post ist abhängig von bestimmten Schriftarten Teile geschrieben werden und Bilder, damit ich den Link hier sehr empfehlen.

Ich dachte ursprünglich Schriftarten ziemlich einfach sein würde. In den Windward Reports (unserem XML- und SQL-Reporting-System) hat sich jedoch der ordnungsgemäße Umgang mit Schriften als großer Aufwand erwiesen. Wenn Sie mehr als nur eine Textzeile in einem Formular platzieren möchten, dann spielen die Details eine Rolle.

Schriftarten & Glyphen Also was ist eine Schrift? Grundsätzlich ist eine Schriftart eine Reihe von Glyphen. Was Sie für einen Charakter wie den Buchstaben A halten, ist eine Glyphe. Eine Schriftart ist dann ein Satz von Zeichen für alle Buchstaben in dieser Schriftart. Wenn Sie die Schriftart Helvetica erhalten, sehen alle ihre Glyphen in eine Richtung aus. Wenn Sie die Schriftart Times Roman erhalten, sehen sie anders aus. Jeder ist der Satz von Glyphen aus dieser Schriftart.

Jetzt müssen wir das Konzept der Code-Seiten einzuführen. Eine Codepage ist eine Zuordnung von einer Charakternummer zu einer bestimmten Glyphe. Programme speicherten ursprünglich jedes Zeichen als ein Byte. Dann gab es für asiatische Zeichensätze die DBCS-Systeme (einige Zeichen waren 1 Byte, einige 2). Programme verwenden heute meistens Unicode, aber Webseiten sind in der Regel UTF-8, eine Multi-Byte-Sequenz, die bis zu 4 Bytes umfassen kann.

Warum Codierung aufrufen? Da jede Schriftart eine Codierung aufweist, bei der die Zeichenummer 178 je nach der von der Schriftart verwendeten Codepage eine sehr unterschiedliche Glyphe zurückgeben kann. Die meisten Schriftdateien verwenden Unicode, sodass Sie dort einen Standard haben, aber viele Programme verwenden immer noch bestimmte Codepages, wobei diese Seite der Schriftart zugeordnet ist. Dies tritt auf, wenn Sie ABC anzeigen und die Schriftart Wingdings ist, so erhalten Sie . Also Punkt eins ist, dass Sie sicherstellen müssen, dass die von Ihnen verwendete Kodierung übereinstimmt oder der Kodierung der von Ihnen verwendeten Fonts zugeordnet ist.

Und es wird noch komplexer. Die Zeichen mit den Werten 0xE000 - 0xF8FF sind nicht definiert. Jede Schriftart kann all das machen, was sie wollen (eine Möglichkeit besteht darin, das klingonische Skript hinzuzufügen). Ein Zeichen mit einem Wert in diesem Bereich ist also definitionsgemäß an die Schriftartdatei gebunden, die zum Anzeigen dieser Schriftart verwendet wird. So funktionieren die meisten Symbolschriftarten.

Ok, so dass Sie verwenden Unicode, Ihre Font-Datei verwendet Unicode, übergeben Sie es einen String und ... die Zeichenfolge zeigt leer. Was ist los? Nun, es gibt keine Anforderung, dass eine Schriftartdatei eine Glyphe für irgendein gegebenes Zeichen hat. Eine Symbolschriftart hat kein ABC. Die meisten in Europa und Amerika verwendeten Schriftarten haben keine chinesischen, japanischen oder koreanischen Zeichen. Es ist kein Fehler, eine Glyphe zu verwenden, die eine Schriftart nicht hat, aber es wird nichts angezeigt, nicht leer, aber nichts (d. H. 0 Punkte breit).

Sie können auch auf ein ähnliches Problem stoßen, wenn Sie eine der alten Codeseiten verwenden, wenn Sie eine Glyphe anzeigen möchten, die auf der Codepage nicht vorhanden ist. In diesem Fall müssen Sie zumindest für dieses Zeichen eine andere Codepage zuordnen (so wurde Word in diesem Fall verwendet).

Schriftfamilien Schriften fallen in verschiedene Klassen. Zuerst gibt es proportionale vs. monospaced Schriftarten. In einer Schriftart mit festem Zeichenabstand haben alle Zeichen dieselbe Breite. Und die Höhe ist konsistent, da alle Kleinbuchstaben die gleiche Höhe wie alle Großbuchstaben haben. Vermeiden Sie so weit wie möglich monospaced Fonts, weil sie viel schwieriger zu lesen sind. Asiatische Fonts sind fast alle monospaced, weil die chinesischen Han-Zeichen alle identische Breiten und Höhen haben, so dass ein Proportionalwert keinen Sinn ergibt. Auf der anderen Seite müssen Hebräisch und Arabisch ziemlich proportional sein.

Weiter ist die Schrift, die serif sein kann, wo Sie Zeug am Ende ihres Strichs bekommen, serifenlos, wo Sie nichts mehr am Ende bekommen, dekorativ, wo es weit über Normalität hinausgeht, und Symbol, das alles haben kann zufällig, einschließlich Barcodes, die den ASCII-Nummern der den Glyphen zugeordneten Zeichencodes entsprechen. Und das sind nur die westeuropäischen Alphabete.

Fontmetrics Jetzt kommen wir zum Messen von Schriften, und von den meisten Schriftarten (nicht alle) misst es Glyphen. Das Standardmaß, das für Schriften verwendet wird, ist der Punkt, und obwohl es viel Geschichte gibt, was ein Punkt ursprünglich bedeutete, ist es für die Computerwelt 72 Punkte = 1 Zoll. Sie werden auch manchmal twip sehen, der für zwanzigste Punkte steht, also 1440 twips == 1 inch. Und wir haben jetzt EMU wo 914400 EMU = = 1 Zoll (mehr hier). Wenn Sie mit Punkten arbeiten, müssen Sie Gleitkommavariablen verwenden. Twips sind im Allgemeinen als Ganzzahl in Ordnung, und EMUs sind definitiv.

Dann kommt die Schriftgröße. Dies ist eine völlig willkürliche Zahl. Stellen Sie es sich vor wie die diagonale Größe der alten CRT-Monitore, bei denen die tatsächliche Größe nahe bei dem war, was Sie erwartet haben, aber nie war diese Zahl. Die Punktgröße bestimmt die Größe der gerenderten Glyphen, hat jedoch keine spezifische Messung auf der Seite.

Jetzt hier ist, wo es beginnt, interessant zu werden, die fontmetrics. Zuerst muss alles von der Grundlinie gemessen werden. Das Arbeiten mit einem anderen Teil der Schrift funktioniert nicht - Sie werden große Probleme haben. Also fang dort an. Der höchste gezeichnete Teil über der Grundlinie ist der Anstieg und der niedrigste gezogene Teil unterhalb der Grundlinie ist der Abstieg, beide gemessen von der Grundlinie.

Dann gibt es den Abstand zwischen zwei Zeilen Text. Dies ist eine Schriftarteinstellung, da der Schriftdesigner bestimmt, welcher Abstand für diese Schriftart angemessen ist. Dies kann auf verschiedene Arten zurückgegeben werden, wobei Windows dies als Abstand über der nächsten Zeile betrachtet, der ein Maß von der Grundlinie zur Grundlinie zurückgibt, während Java den Abstand unterhalb einer Zeile vor der nächsten Zeile anzeigt und nur diesen Wert zurückgibt. Dieser Zeilenabstand ist der Abstand, den Sie zwischen Zeilen eines ähnlichen einzelnen Textbereichs platzieren. Wenn der Abstand größer als ein einzelner Abstand ist, fügen Sie diesen Wert hinzu.

Normalerweise möchten Sie diese Höhen für die Schriftarten, nicht für die Zeichenfolge von Glyphen in der Zeichenfolge, die Sie anzeigen. Warum? Denn wenn eine Zeile "wir waren wrox" wäre - ohne Ober- oder Unterlängen wäre die Zeile näher an den anderen Zeilen im Absatz platziert, und das würde komisch aussehen. Sie müssen sich auch alle Schriftarten und Schriftgrößen ansehen, denn wenn ein Text größer ist, müssen Sie die großen Werte für Aufstieg/Abstieg/Anfang verwenden. Aber nur für die Zeile (n), die den größeren Text haben, nicht für den ganzen Absatz. Und wieder wird alles von der Grundlinie gemessen, die die einzige Möglichkeit ist, gemischte Schriften/Größen zu handhaben.

Ok, Höhe braucht ein bisschen Arbeit, aber es ist ziemlich einfach, aber die Breite - das wird wirklich interessant. Und interessant, ich meine, du musst alles richtig machen. Abgesehen von Schriften mit fester Breite entspricht die Summe der einzelnen Glyphen grundsätzlich nicht der Breite aller Glyphen, die zusammen gerendert werden. Ziemlich viel nie. Warum? Ein paar Gründe:

• Kerning ist, wo Buchstaben basierend auf dem Buchstaben der angrenzenden gesetzt werden. Deshalb bleibt AB deutlich, während es sich ziemlich überschneidet. • Einige Zeichenkombinationen in lateinischen Alphabeten werden kombiniert, wie zB ae wird æ und in Deutsch ss wird ß. • Hebräische und arabische Zeichen sind für das gleiche Zeichen unterschiedlich, abhängig davon, ob es am Anfang, an der Mitte oder am Ende eines Wortes steht. Und im Fall von Arabisch sind die an den Enden verwendeten Glyphen tendenziell breiter als die Glyphen in der Mitte. Also hängt die Breite von of davon ab, wo es in der Zeichenkette ist. ◦Bidirektionale Schriftarten haben ein zusätzliches Problem, das unten aufgeführt ist. • Komplexe Skripte wie Indisch (Indien) ändern die Glyphe an einem Ort, der aus mehreren Zeichen besteht. Eine Zeichenfolge mit drei Zeichen kann also zwischen 1 und 3 Zeichen breit sein. Ganz einfach müssen Sie eine vollständige, vollständig formatierte Zeichenfolge an die fontmetrics-API übergeben, die von der Plattform zur Verfügung gestellt wird, auf der Sie die Länge der Zeichenfolge abrufen. Es ist ein teurer Aufruf, weil die Zeichenfolge in den Speicher gerendert wird, um die Länge zu bestimmen, aber es gibt keine Alternative, die genau ist. Und Sie müssen die exakt gleichen Einstellungen verwenden wie beim Rendern. Wenn diese nicht übereinstimmen, haben wir Unterschiede gefunden, die groß genug sind, dass das menschliche Auge sie erkennen kann. Der beste Weg, um Ihren Code dafür zu testen, ist rechts ausgerichteten Text zu sehen, weil Sie in der Regel die Grundposition des linken Endes der Zeichenfolge beim Rendern erhalten müssen, wenn Sie die Länge falsch berechnen - es wird angezeigt.

Bidirektionaler Text Schließlich haben wir das Problem der bidirektionalen Text (Arabisch & Hebräisch). Bidirektionaler Text geht von rechts nach links, außer Zahlen und lateinische Wörter gehen von links nach rechts. So wird es von rechts nach links gelesen, dann springen Sie auf eine Zahl oder Folge lateinischen Textes hinüber zum linken Punkt, lesen von links nach rechts zurück, wo Sie das vorhergehende Hebräisch/Arabisch abgeschlossen haben, dann springen Sie zum Anfang des Lateinischen/Nummer Teil und gehe zurück nach rechts nach links.

Es hat eine Menge Forschung darüber gemacht, wann diese Schalter stattfinden sollen. Es gibt Zeichen, die eine starke Richtung haben, Zeichen, die eine schwache Richtung haben, und Zeichen, die keine Richtungspräferenz haben. Sie haben kein Gebet, diese Regeln korrekt umzusetzen. Keiner. Aber alles ist nicht verloren. So ziemlich jede Plattform, einschließlich Java und Windows, verfügt über eine API, in der Sie die Zeichenfolge in der gelesenen Reihenfolge angeben und sie gemäß den Regeln korrekt darstellen. Sie verfügen auch über eine API, die Ihnen mitteilt, wo sich das jeweilige Zeichen befindet und auf welches Zeichen Sie wechseln sollten, wenn Sie das Caret 1-Zeichen vorwärts oder rückwärts verschieben möchten.

Sie können diese API für alle Schriften Rendering und Caret Bewegung unabhängig von Text verwenden und es wird gut funktionieren - auch für komplexe Skripte. Es ist ein bisschen peinlich, damit anzufangen, wenn du nicht auf bi-di oder komplexe Skripte abzielst, aber wenn du irgendwann da sein wirst, ist es am besten, es zu benutzen, damit du deine Architecture nicht neu gestalten musst Code. Vertrauen Sie mir, Sie wollen wirklich nicht rearchitect (ich musste einmal - OW!).

Warnung Kopieren Sie keine Windows-Schriftarten auf Linux oder andere Betriebssysteme. Die Schriftartmetriken sind in der Regel ausgeschaltet und der Text sieht aus. Ich weiß nicht, was als TrueType portabel sein soll, aber in der Praxis wie Java ist einmal überall debuggen, Schriftarten neigen dazu, Design zu sein, einmal zwicken überall. Laden Sie Zeichensätze von einem Anbieter herunter, der sie für Ihre Plattform optimiert hat.

+0

+1. Gute Antwort! –

Verwandte Themen