Получить информацию о шрифтах (Как узнать поддрежку символов шрифта?)
Модератор: /dev/random
-
ekkl
- Сообщения: 139
- ОС: 3.17.3-300.fc21.x86_64
Получить информацию о шрифтах
Скачал пак шрифтов (около 300 штук). Нужно отобрать только те, который поддерживают украинский язык.
Есть способ узнать, существуют ли в шрифте буквы "і", "є"б "ї"?
Та же самая гномовская программа просмотра шрифтов, если есть поддержка украинского языка выводит фразу предпросмотра "Жебракують філософи..." а В случае, если нет поддрежки - фразу на анлийском языке.
Есть способ узнать, существуют ли в шрифте буквы "і", "є"б "ї"?
Та же самая гномовская программа просмотра шрифтов, если есть поддержка украинского языка выводит фразу предпросмотра "Жебракують філософи..." а В случае, если нет поддрежки - фразу на анлийском языке.
dd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
И пусть весь мир подождет.....
-
sgfault
- Сообщения: 586
- Статус: -
Re: Получить информацию о шрифтах
(для fontconfig-a)
Проверить есть ли в шрифте "рисунки" символов соответствующего языка можно, например, так
Наличие конкретных символов можно проверить по полю charset в выводе
Поле charset - это битовое поле: если в шрифте есть "рисунок" (glyph) для символа с кодом в Unicode равным номеру позиции в битовом поле, то в этой позиции битового поля будет стоять 1, иначе 0. Как несложно заметить, выполнив эту команду, битовое поле выводится блоками по 4 байта (видимо, размер int-a) и в одной строке 8 байт. Те, получается, что один блок (4 байта) описывает 32 (= 4 * 8бит) символа Юникода, а одна строка - 256 (= 8 * 32) символов. Те все символы однобайтовой кодировки (например, ascii) будут описаны одной строкой (для ascii - это первая строка). Также, следует учитывать, что в выводе 4-байтные блоки битового поля идут в порядке "старший правее младшего" (старший - это содержащий информацию о символах с большим кодом в Юникоде), а биты в блоке идут в обратном порядке - "старший левее младшего". Вот пример:
Возьмем первые четыре 4-байтных блока для любого (?) шрифта, которые соответствуют первым 128 символам acii
Тогда,
блок 00000000 - это "рисунки" (glyph-ы) для символов с кодами 0x0 - 0x1f (для них нету "рисунков")
первый блок ffffffff - это "рисунки" для символов с кодами 0x20-0x3f
второй блок ffffffff - это "рисунки" для символов с кодами 0x40-0x5f
и последний блок 7fffffff - это "рисунки" для символов с кодами 0x60-0x7f, причем символ 0x7f не имеет рисунка и бит, соответствующий ему, - старший бит последнего блока (он равен 0), - будет самый левый (в выводе). Те биты внутри блока записаны в привычной "системе" - старший разряд слева, а блоки относительно друг друга - наоборот, старший блок правее.
Чтобы определить наличие какого-то конкретного символа, осталось найти его в таблице Юникода и посмотреть установлен ли соответствующий бит. Например, буква 'ы' имеет код в Юникоде 0x044B, значит мы должны найти строку в поле charset, отмеченную, как
и найти в этой строке бит, соответствующий символу
(не уверен, но вроде ничего не напутал -)
UPD.
Бит
будет в третьем блоке слева (нужная 16-ричная цифра обозначена Y)
и он установлен, если для этой цифры Y выражение
истина.
Проверить есть ли в шрифте "рисунки" символов соответствующего языка можно, например, так
Код: Выделить всё
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, отмеченную, как
Код: Выделить всё
0004и найти в этой строке бит, соответствующий символу
Код: Выделить всё
4b(не уверен, но вроде ничего не напутал -)
UPD.
Бит
Код: Выделить всё
4bбудет в третьем блоке слева (нужная 16-ричная цифра обозначена Y)
Код: Выделить всё
xx xx xY xxи он установлен, если для этой цифры Y выражение
Код: Выделить всё
(Y & 0x8)истина.
-
ekkl
- Сообщения: 139
- ОС: 3.17.3-300.fc21.x86_64
Re: Получить информацию о шрифтах
Спасибо.
Но как можно проделать подобные операции со шрифтами по имени файла (шрифт не установлен) просто не хочу ставить "ненужные" шрифты.
Отсутствие некоторых присущих укр. языку букв сильно напрягает, когда они отображаются "шрифтом по-умолчанию" и выглядят не так как остальной текст.
Та же программа отображает шрийт без его установки.
---
Нашел программу, которая выполняет подобные операции по имени файла fc-query
Только не пойму, как вытащить из всего потока вывода только то, что мне нужно - поддержку символов?
И что дают опции -i -f?
В мануале только сказано, что это индекс и формат и больше ничего
Но как можно проделать подобные операции со шрифтами по имени файла (шрифт не установлен) просто не хочу ставить "ненужные" шрифты.
Отсутствие некоторых присущих укр. языку букв сильно напрягает, когда они отображаются "шрифтом по-умолчанию" и выглядят не так как остальной текст.
Та же программа отображает шрийт без его установки.
---
Нашел программу, которая выполняет подобные операции по имени файла fc-query
Только не пойму, как вытащить из всего потока вывода только то, что мне нужно - поддержку символов?
И что дают опции -i -f?
В мануале только сказано, что это индекс и формат и больше ничего
Код: Выделить всё
-i, --index INDEX display the INDEX face of each font file only
-f, --format=FORMAT use the given output formatdd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
И пусть весь мир подождет.....
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
-
ekkl
- Сообщения: 139
- ОС: 3.17.3-300.fc21.x86_64
Re: Получить информацию о шрифтах
Аналогичный вопрос и по fc-scan /path/to/font.ttf выбор из всего вывода только кодировку.
Та же опция
Та же опция
Код: Выделить всё
-f, --format=FORMAT use the given output formatdd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
И пусть весь мир подождет.....
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo
Re: Получить информацию о шрифтах
fc-scan -f%{lang} файл #выведет список поддерживаемых языков
fc-scan -f%{charset} файл #выведет (в бинарном виде) маску символов
fc-scan -f%{charset} файл #выведет (в бинарном виде) маску символов
-
ekkl
- Сообщения: 139
- ОС: 3.17.3-300.fc21.x86_64
Re: Получить информацию о шрифтах
спасибо, все работает, только не могу понять сокращений для поддреживаемых языков
Где искать и как?
Код: Выделить всё
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: Получить информацию о шрифтах
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: Получить информацию о шрифтах
В том то и сложность, что я пересмотрел несколько шрифтов, но ни в одном не было поддрежки руского и украинского языка По
Примерно такой список, как я приводил ниже. Но в просмотре пекрасно наблюдается, что украинский язык есть, и установленный проблем не вызывает.
Код: Выделить всё
fc-scan -f%{lang}Примерно такой список, как я приводил ниже. Но в просмотре пекрасно наблюдается, что украинский язык есть, и установленный проблем не вызывает.
dd if=/dev/zero of=/dev/null bs=1M
И пусть весь мир подождет.....
И пусть весь мир подождет.....
-
/dev/random
- Администратор
- Сообщения: 5456
- ОС: Gentoo