Получить информацию о шрифтах (Как узнать поддрежку символов шрифта?)

Софт под Linux, разные программы, но только связанные с Linux

Модератор: /dev/random

ekkl
Сообщения: 139
ОС: 3.17.3-300.fc21.x86_64

Получить информацию о шрифтах

Сообщение ekkl »

Скачал пак шрифтов (около 300 штук). Нужно отобрать только те, который поддерживают украинский язык.
Есть способ узнать, существуют ли в шрифте буквы "і", "є"б "ї"?
Та же самая гномовская программа просмотра шрифтов, если есть поддержка украинского языка выводит фразу предпросмотра "Жебракують філософи..." а В случае, если нет поддрежки - фразу на анлийском языке.
dd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Получить информацию о шрифтах

Сообщение sgfault »

(для fontconfig-a)
Проверить есть ли в шрифте "рисунки" символов соответствующего языка можно, например, так

Код: Выделить всё

fc-list :lang=ru (сюда надо подставить обозначение украинского)


Наличие конкретных символов можно проверить по полю charset в выводе

Код: Выделить всё

fc-match -v 'Font_name_pattern'


Поле charset - это битовое поле: если в шрифте есть "рисунок" (glyph) для символа с кодом в Unicode равным номеру позиции в битовом поле, то в этой позиции битового поля будет стоять 1, иначе 0. Как несложно заметить, выполнив эту команду, битовое поле выводится блоками по 4 байта (видимо, размер int-a) и в одной строке 8 байт. Те, получается, что один блок (4 байта) описывает 32 (= 4 * 8бит) символа Юникода, а одна строка - 256 (= 8 * 32) символов. Те все символы однобайтовой кодировки (например, ascii) будут описаны одной строкой (для ascii - это первая строка). Также, следует учитывать, что в выводе 4-байтные блоки битового поля идут в порядке "старший правее младшего" (старший - это содержащий информацию о символах с большим кодом в Юникоде), а биты в блоке идут в обратном порядке - "старший левее младшего". Вот пример:

Возьмем первые четыре 4-байтных блока для любого (?) шрифта, которые соответствуют первым 128 символам acii

Код: Выделить всё

0000: 00000000 ffffffff ffffffff 7fffffff

Тогда,
блок 00000000 - это "рисунки" (glyph-ы) для символов с кодами 0x0 - 0x1f (для них нету "рисунков")
первый блок ffffffff - это "рисунки" для символов с кодами 0x20-0x3f
второй блок ffffffff - это "рисунки" для символов с кодами 0x40-0x5f
и последний блок 7fffffff - это "рисунки" для символов с кодами 0x60-0x7f, причем символ 0x7f не имеет рисунка и бит, соответствующий ему, - старший бит последнего блока (он равен 0), - будет самый левый (в выводе). Те биты внутри блока записаны в привычной "системе" - старший разряд слева, а блоки относительно друг друга - наоборот, старший блок правее.

Чтобы определить наличие какого-то конкретного символа, осталось найти его в таблице Юникода и посмотреть установлен ли соответствующий бит. Например, буква 'ы' имеет код в Юникоде 0x044B, значит мы должны найти строку в поле charset, отмеченную, как

и найти в этой строке бит, соответствующий символу


(не уверен, но вроде ничего не напутал -)

UPD.
Бит

будет в третьем блоке слева (нужная 16-ричная цифра обозначена Y)

Код: Выделить всё

xx xx xY xx

и он установлен, если для этой цифры Y выражение

Код: Выделить всё

(Y & 0x8)

истина.

Спасибо сказали:
ekkl
Сообщения: 139
ОС: 3.17.3-300.fc21.x86_64

Re: Получить информацию о шрифтах

Сообщение ekkl »

Спасибо.
Но как можно проделать подобные операции со шрифтами по имени файла (шрифт не установлен) просто не хочу ставить "ненужные" шрифты.
Отсутствие некоторых присущих укр. языку букв сильно напрягает, когда они отображаются "шрифтом по-умолчанию" и выглядят не так как остальной текст.
Та же программа отображает шрийт без его установки.
---
Нашел программу, которая выполняет подобные операции по имени файла fc-query
Только не пойму, как вытащить из всего потока вывода только то, что мне нужно - поддержку символов?
И что дают опции -i -f?
В мануале только сказано, что это индекс и формат и больше ничего

Код: Выделить всё

-i, --index INDEX    display the INDEX face of each font file only
  -f, --format=FORMAT  use the given output format
dd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Получить информацию о шрифтах

Сообщение /dev/random »

ekkl писал(а):
16.11.2010 20:49
Но как можно проделать подобные операции со шрифтами по имени файла (шрифт не установлен) просто не хочу ставить "ненужные" шрифты.

fc-scan /path/to/font.ttf
Спасибо сказали:
ekkl
Сообщения: 139
ОС: 3.17.3-300.fc21.x86_64

Re: Получить информацию о шрифтах

Сообщение ekkl »

Аналогичный вопрос и по fc-scan /path/to/font.ttf выбор из всего вывода только кодировку.
Та же опция

Код: Выделить всё

 -f, --format=FORMAT  use the given output format
dd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Получить информацию о шрифтах

Сообщение /dev/random »

fc-scan -f%{lang} файл #выведет список поддерживаемых языков
fc-scan -f%{charset} файл #выведет (в бинарном виде) маску символов
Спасибо сказали:
ekkl
Сообщения: 139
ОС: 3.17.3-300.fc21.x86_64

Re: Получить информацию о шрифтах

Сообщение ekkl »

спасибо, все работает, только не могу понять сокращений для поддреживаемых языков

Код: Выделить всё

aa|ar|as|ast|ba|be|bg|bin|br|bs|ca|co|crh|cu|cy|de|ee|el|en|es|et|fa|ff|fj|ga|gn
|gv|ha|haw|he|hi|hne|is|ka|kaa|kl|ku-tr|kum|kw|kwm|ky|la|lah|lez|lg|ln|mg|mh|mk|mr|ne|ng|no|nr|nso|nv|ny|oc|om|ps-pk|pt|rn|sah|sco|sel|sh|sid|sk|so|sr|tg|ti-et|tl|to|tw|tyv|ur|ve|wa|wal|wo|xh|yap|yo|zh-cn|zh-hk|zh-tw

Где искать и как?
dd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Получить информацию о шрифтах

Сообщение /dev/random »

ekkl писал(а):
17.11.2010 02:30
спасибо, все работает, только не могу понять сокращений для поддреживаемых языков

Код: Выделить всё

aa|ar|as|ast|ba|be|bg|bin|br|bs|ca|co|crh|cu|cy|de|ee|el|en|es|et|fa|ff|fj|ga|gn
|gv|ha|haw|he|hi|hne|is|ka|kaa|kl|ku-tr|kum|kw|kwm|ky|la|lah|lez|lg|ln|mg|mh|mk|mr|ne|ng|no|nr|nso|nv|ny|oc|om|ps-pk|pt|rn|sah|sco|sel|sh|sid|sk|so|sr|tg|ti-et|tl|to|tw|tyv|ur|ve|wa|wal|wo|xh|yap|yo|zh-cn|zh-hk|zh-tw

Где искать и как?

Двухбуквенные: wikipedia://List_of_ISO_639-1_codes (столбец "639-1")
Трёхбуквенные: wikipedia://List_of_ISO_639-3_codes (когда для этого языка нет двухбуквенного кода)
Через дефис: региональный диалект, слева код языка, справа код страны wikipedia://ISO_3166-1#Current_codes
Спасибо сказали:
ekkl
Сообщения: 139
ОС: 3.17.3-300.fc21.x86_64

Re: Получить информацию о шрифтах

Сообщение ekkl »

В том то и сложность, что я пересмотрел несколько шрифтов, но ни в одном не было поддрежки руского и украинского языка По

Код: Выделить всё

fc-scan -f%{lang}

Примерно такой список, как я приводил ниже. Но в просмотре пекрасно наблюдается, что украинский язык есть, и установленный проблем не вызывает.
dd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Получить информацию о шрифтах

Сообщение /dev/random »

ekkl писал(а):
17.11.2010 11:12
Примерно такой список, как я приводил ниже. Но в просмотре пекрасно наблюдается, что украинский язык есть, и установленный проблем не вызывает.

Вероятно, эти языки просто не заявлены. Смотрите маску символов.
Спасибо сказали: