2010-12-04 4 views

ответ

4

Существует очень хорошее представление о What every developer should know about fonts.

Я скопировал сообщение здесь, но большая часть сообщения зависит от конкретных частей шрифтов, написанных на и картинах, поэтому я настоятельно рекомендую ссылку выше.

Первоначально предполагалось, что использование шрифтов будет довольно простым. Однако правильная обработка шрифтов оказалась значительным усилием в Windward Reports (нашей системе XML и SQL Reporting). Если вы собираетесь делать гораздо больше, чем размещать текст в форме, то детали начинают иметь значение.

Шрифты & Glyphs Итак, что такое шрифт? В основном шрифтом является серия глифов. То, что вы думаете как персонаж, такой как буква А, - это символ. Затем шрифт представляет собой набор символов для всех букв в этом шрифте. Если вы получаете шрифт Helvetica, все их глифы выглядят в одну сторону. Если вы получаете шрифт Times Roman, они выглядят иначе. Каждый из них - это набор глифов из этого шрифта.

Теперь нам нужно ввести концепцию кодовых страниц. Кодовая страница - это сопоставление от номера символа к определенному глифу. Программы изначально сохраняли каждый символ в виде байта. Затем для азиатских наборов символов существовали системы DBCS (некоторые символы были 1 байт, некоторые 2). Сегодня программы в основном используют Unicode, но веб-страницы имеют тенденцию быть UTF-8, которая представляет собой многобайтную последовательность, которая может содержать до 4 байтов.

Зачем генерировать кодировку? Поскольку каждый шрифт имеет кодировку, где номер символа 178 может возвращать совсем другой символ в зависимости от кодовой страницы, используемой шрифтом. Большинство файлов шрифтов используют Unicode, поэтому у вас есть стандарт, но многие программы по-прежнему используют специальные страницы кода, где эта страница сопоставляется с шрифтом. Это то, что происходит, когда вы показываете ABC, а шрифт - Wingdings, поэтому вы получаете . Итак, в первую очередь вам нужно убедиться, что кодировка, которую вы используете, совпадает или сопоставляется с кодировкой используемых вами шрифтов.

И это становится еще более сложным. Символы со значениями 0xE000 - 0xF8FF не определены. Каждый шрифт может сделать все, что угодно (один из них - добавить скрипт Klingon). Таким образом, символ со значением в этом диапазоне по определению привязан к файлу шрифта, который он использует для отображения этого шрифта. Так работают большинство шрифтовых шрифтов.

Итак, вы используете Unicode, ваш файл шрифтов использует Unicode, вы передаете ему строку и ... строка отображает пустое. Что происходит? Ну, нет требования, чтобы файл шрифта имел глиф для любого заданного символа. У шрифта Symbol не будет ABC. Большинство шрифтов, используемых в Европе и Америке, не имеют китайских, японских или корейских символов. Нельзя использовать глиф, который не имеет шрифта, но он ничего не отображает, а не пустое, но ничего (т. Е. 0 точек в ширину).

Вы также можете столкнуться с аналогичной проблемой, если используете одну из старых кодовых страниц, если хотите отобразить глиф, который не существует на кодовой странице. В этом случае вам нужно отобразить другую страницу кода, по крайней мере, для этого символа (так Word используется для обработки этого случая).

Шрифтовые семьи Шрифты относятся к нескольким различным классам. Сначала есть пропорциональные и моноширинные шрифты. В моноширинном шрифте все символы имеют одинаковую ширину. И высота согласуется с тем, что все строчные буквы имеют ту же высоту, что и весь верхний регистр. Избегайте моноширинных шрифтов, насколько это возможно, потому что их гораздо труднее читать. Азиатские шрифты почти все моноширинные, потому что китайские ханьцы имеют одинаковые ширины и высоты, поэтому пропорциональный смысл не имеет смысла. С другой стороны, иврит и арабский в значительной степени должны быть пропорциональными.

Следующий шрифт, который может быть засечками, где вы получаете материал в конце их хода, без засечек, где вы не получаете ничего лишнего в конце, декоративный, где он выходит за пределы обычного, и Символ, который может иметь что угодно случайные, включая штрих-коды, которые соответствуют номерам ASCII кодов символов, отображаемых на глифы. И это всего лишь западноевропейские алфавиты.

Fontmetrics Теперь мы подходим к измерению шрифтов, а шрифты чаще всего (не все) из них измеряют глифы. Стандартное измерение, используемое для шрифтов, является точкой, и, хотя существует много истории для того, что изначально означало, для компьютерного мира это было 72 пункта == 1 дюйм. Вы также будете иногда видеть твип, который стоит двадцатый точки, поэтому 1440 twips == 1 дюйм. И теперь у нас есть EMU, где 914400 EMU = 1 дюйм (более здесь). Если вы работаете с точками, вам нужно использовать переменные с плавающей запятой. Как правило, twips в порядке, как целое число, и EMU определенно.

Затем появляется размер шрифта. Это вполне произвольное число. Подумайте об этом, как о диагональном размере старых мониторов CRT, где фактический размер близок к тому, что вы ожидали, но никогда не был таким. Размер точки определяет размер отображаемых глифов, но на этой странице нет конкретных измерений.

Теперь вот, где начинает интересоваться шрифтметрия. Во-первых, все должно измеряться от базовой линии. Работа с любой другой частью шрифта не будет работать - вы столкнетесь с серьезными проблемами. Так что начните там. Самая высокая нарисованная часть над базовой линией заключается в том, что восхождение и самая низкая нарисованная часть ниже базовой линии - это спуск, оба измеренные от базовой линии.

Тогда есть расстояние между двумя строками текста. Это настройка шрифта, так как дизайнер шрифтов определяет, что такое подходящий интервал для этого шрифта. Это можно вернуть по-разному, Windows считает это интервалом, который вы ставите над следующей строкой, возвращающей меру от базовой линии до базовой линии, в то время как Java рассматривает ее как расстояние ниже строки до следующей строки и возвращает именно это значение. Это приводит к тому, что вы размещаете между строками аналогичного однострочного текста. Если интервал больше одиночного интервала, то вы добавляете к этому значению.

Обычно вы хотите получить эти высоты для шрифтов, а не строку глифов в строке, которую вы показываете. Зачем? Потому что, если строка «мы были wrox» - без восходящих или нисходящих линий линия будет помещена ближе к другим строкам в абзаце, и это выглядело бы странно. Вам также нужно посмотреть на все шрифты и размеры точек, потому что, если какой-то текст больше, вы должны использовать большие значения восхождения/спуска/начала. Но только для строк (линий), которые имеют больший текст, а не для всего абзаца. И снова все это измеряется от базовой линии, которая является единственным способом обработки смешанных шрифтов/размеров.

Хорошо, высота занимает немного работы, но это довольно просто, но ширина - это становится действительно интересным. И интересным я имею в виду, что вы должны все исправить. По сути, за исключением шрифтов с фиксированной шириной, сложение ширины каждого символа не будет равно ширине всех этих глифов, отображаемых вместе. Довольно много никогда. Зачем? Несколько причин:

• Кернинг - это место, где буквы размещены на основе буквы соприкосновения. Вот почему AB остается отличным, а tt перекрывается совсем немного. • Некоторые комбинации символов в латинских алфавитах объединены, например, ae становится æ, а на немецком языке становится ß. • Иврит и арабские глифы различаются для одного и того же символа в зависимости от того, находится ли он в начале, середине или конце слова. А в случае с арабским, особенно глифы, используемые на концах, имеют тенденцию быть шире, чем глифы посередине. Таким образом, ширина ص зависит от того, где она находится в строке. ◦Высокочастотные шрифты имеют дополнительную проблему, перечисленную ниже. • Сложные сценарии, такие как Indic (Индия), изменят глиф в месте, создающем его из нескольких символов. Таким образом, строка из трех символов может содержать от 1 до 3 глифов. Очень просто, вам нужно передать полную, полностью отформатированную строку, в API шрифтов, предоставляемый платформой, на которой вы работаете, чтобы получить длину строки. Это дорогой вызов, потому что строка будет отображаться в памяти для определения длины, но нет никакой альтернативы, которая будет точной. И вы должны использовать те же самые параметры, что и при рендеринге. В любое время, когда они не совпадают, мы обнаружили различия, достаточно большие, чтобы человеческий глаз мог их разглядеть. Лучший способ проверить свой код для этого - посмотреть на выравниваемый текст справа, потому что вам обычно нужно получить базовую позицию левого конца строки при рендеринге, если вы вычислите длину неправильно - она ​​покажет.

Двунаправленный текст Наконец, у нас есть вопрос двунаправленного текста (арабский & иврит). Двунаправленный текст идет справа налево, за исключением номеров и латинских слов слева направо. Поэтому он читается справа налево, а затем по количеству или последовательности латинского текста вы переходите налево в самую точку, читаете слева направо назад, где вы закончили предыдущий иврит/арабский, затем переходите к началу латинского/номер части и вернуться вправо налево.

Проводилась тонна исследований, когда эти переключатели должны были проходить. Есть символы, которые имеют сильное направление, символы, которые имеют слабое направление, и символы, которые не имеют направленного предпочтения. У вас нет молитвы правильного применения этих правил. Никто. Но еще не все потеряно. Практически каждая платформа, включая Java и Windows, имеет API, в котором вы указываете строку символов в порядке чтения, и она будет отображать их правильно в соответствии с правилами. У них также есть API для того, чтобы сообщать вам, где находится каждый персонаж, и какого персонажа вы должны переместить, если вы хотите переместить символ 1 вперёд или назад.

Вы можете использовать этот API для всех визуализации шрифтов и каретки независимо от текста, и он будет работать отлично - на сложных скриптах. Это немного боль, чтобы начать с этого, если вы не нацеливаете би-ди или сложные скрипты, но если вы собираетесь там, в конечном итоге, лучше начать использовать его, чтобы не переделывать ваши код. Поверьте мне, вы действительно не хотите, чтобы мне пришлось перестраивать (я должен был однажды - OW!).

Предупреждение Не копируйте шрифты Windows в Linux или другие операционные системы. Шрифтметрики, как правило, выключены, и текст будет отключен. Я не знаю, как TrueType должен быть переносимым, но на практике, как и Java, пишутся после отладки повсюду, шрифты, как правило, разрабатываются во время настройки. Получите шрифты от поставщика, который оптимизировал их для вашей платформы.

+0

+1. Отличный ответ! – 2010-12-22 00:30:53