Custom Korean Fonts in Ubuntu Linux

Как известно, существует 3 общепринятых названия для семейств шрифтов:

  • Пропорциональные с засечками, serif. Широко используются в типографии, где не присутствуют ограничения, связанные с низкой разрешающей способностью (DPI) отображающих устройств; в “электронных” материалах ими оформляются различные более-менее объемные статьи, руководства, тексты книг и т.д.
  • Пропорциональные без засечек, sans-serif. Используются в оформлении интерфейсов программ. Как считается, легче для восприятия на устройствах с низким разрешением (таких, как, например, обыкновенные мониторы).
  • Моноширинные, monospace. В основном используются там, где важно соблюсти структуру текста, например, в текстовых схемах, ASCII-арте; также в листингах кода.

Корейские “Jamo” — основной слоговый элемент письменного корейского языка — очень красивы в начертании. Особенно это заметно, если используется шрифт “с засечками” и почти не заметно, если шрифт “без засечек”. Поэтому, встала задача: все корейские символы, отображаемые шрифтом sans-serif, заменять на шрифт из семейства sans, сохраняя, при этом, семейство по умолчанию для символов не-корейского алфавита.

По крайней мере в линуксе, sans, serif и monospace выступают в качестве “алиасов” для одного или нескольких шрифтов, представляющих семейство в целом, и для современных дистров им соответствуют шрифты из сеймейства DejaVu. Таким образом, можно в определенном месте (например, в терминале) выставить шрифт “Monospace”, а на деле будет отображаться DejaVu Monospace, так же для всей системы целиком. Это удобно, если вдруг захочется, чтобы моноширинный текст рендерился, например, Terminus’ом. Для корейских символов верно такое соответствие в Ubuntu 8.10:

  • Serif: UnBatang
  • Sans-serif: UnDotum
  • Monospace: AFAIU, все корейские шрифты являются моноширинными, по умолчанию установлен UnDotum.

Мне очень нравится UnBatang, поэтому в интерфейсе (Sans) я хочу видеть именно его вместо некрасивого UnDotum. Соответствия шрифтов с “алиасами” Serif и Monospace остается назначить по вкусу, пока я остановился на UnGungseo и UnDotum соответственно. Примерно так (не забывайте кликать по картинкам):

Korean fonts

А как отображается у вас? 안녕하세요!

Локальную конфигурацию рендеринга шрифтов (fontconfig & ko) рекомендуется осуществлять через ~/.fonts.conf, исчерпывающее описание которого приведено в man fonts-conf. Итак, нам нужно, когда приложение попросит шрифт определенного алиаса (sans-serif, serif, monospace) для отображения символов корейского языка, отдать называние желаемого шрифта вместо алиаса (или как-то так). Консультируемся с маном, в конфиге пишем:

~/.fonts.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
 
<!-- Set some nice default korean fonts -->
 
        <match target="pattern">
                <test qual="any" name="family"><string>sans-serif</string></test>
                <test qual="any" name="lang"><string>ko</string></test>
 
                <edit name="family" mode="assign" binding="strong">
                        <string>UnBatang</string>
                </edit>
        </match>
 
        <match target="pattern">
                <test qual="any" name="family"><string>serif</string></test>
                <test qual="any" name="lang"><string>ko</string></test>
 
                <edit name="family" mode="assign" binding="strong">
                        <string>UnGungseo</string>
                </edit>
        </match>
 
        <match target="pattern">
                <test qual="any" name="family"><string>monospace</string></test>
                <test qual="any" name="lang"><string>ko</string></test>
 
 
                <edit name="family" mode="assign" binding="strong">
                        <string>UnDotum</string>
                </edit>
        </match>
 
</fontconfig>

Вот и все! Выглядит же это так:

Mix of korean and cyrillic font families

Обратите внимание, в качестве шрифта для системного интерфейса установлен Sans (он и отображается), и он же выбран в программе “Таблица символов”, где отображается UnBatang, вместо UnDotum. Ура!

Поскольку jamo объединяют в себе от двух до четырех символов, выглядят они заметно мельче, чем буквы латинского или кириллического алфавитов. Если же jamo “растянуть” при помощи fontconfig, т.е. чтобы они при размере X всех прочих символов отображались бы размером на Y большим, X+Y, то они перестанут вмещаться в текстбоксы, расчитанные на более мелкий (X) размер шрифта. Т.е. вместо

editbox-batang-normal

получим

editbox-batang-stretched

Если вы все же хотите попробовать, вот код, который нужно добавить в match’и:

<edit name="matrix" mode="assign">
        <times>
                <name>matrix</name>
                <matrix><double>1.2</double><double>0</double>
                        <double>0</double><double>1.2</double>
                </matrix>
        </times>
</edit>

For those who are curious, так может выглядеть “кореезированная” убунта (скрин с ноута):

Koreanized ubuntu