Зауваження : долучення, з цього документу відновити, здається, немає змоги. Вони пропали. Крім того, невідомо, хто був першим автором документу. Якщо автор цього HOWTO читає це, зверніться, будь ласка, до когось з адміністрації даної сторінки.--Дмитро Ковальов 05:42, 4 Серп 2004 (EEST)

Коментар до зауваження : чудеса бувають! Свідчення цього — долучення до цього документу, ось вони: http://docs.linux.org.ua/stuff/Alt-Ukrainian-HOWTO.tar.gz. --JaFd 10:41, 4 Серп 2004 (EEST)

Коментар до коментаря до зауваження : Дякую. Тут же в долученні відшукалась і адреса автора. paul ет kis крапка kiev крапка ua--Дмитро Ковальов 03:31, 5 Серп 2004 (EEST)


Цей текст описує технічний процес української локалізації Linux (різні кодування в різних програмних пакетах). На відміну від інших подібних текстів автор заздалегідь відмовляється від ідеї використовувати готові файли (хіба що в якості напівфабрикатів). Причина - бажання використати кодування "укр.гост", ніяких файлів для якого ніде не знайдеш AFAIK. Але замість того, щоб просто зробити ці файли, автор вирішив розродитись цілою серією статей про те, як зробити підтримку будь-якого кодування з нуля на прикладі необхідного йому. Звичайно, за допомогою цього тексту колись можна буде локалізувати не тільки український Linux, але для цього доведеться почекати на переклад цієї статті анґлійською мовою.

Для роботи знадобилася купа спеціальних "утиліт", джерельні тексти яких додаються. В тексті стандартні утиліти відрізняються від написаних самим автором за допомогою символів "./".

Наприклад:

./bsf2tsf 866.8x16 866.cp>>fonts.16
charset G0 user

В першому рядку використовується написана автором утиліта, а в другому - стандартна утиліта Linux.

Час від часу в тексті зустрічаються конструкції виду:

... <табличка перекодування>

тобто якийсь текст в трикутних дужках. Це означає, що замість цього тексту (і трикутних дужок також) слід підставити реальне ім'я файла. В той же час знаки < і > активно використовуються за їх прямим призначенням - перенаправлення стандартних потоків. Але не пригадую, щоб цей спосіб позначення десь створював якісь двозначності - маємо або те, або інше.

Alt-Ukrainian-HOWTO.tar.gz (20.7 K)

Шрифти для консолі

Найкраще шрифти для Linux-консолі робити в форматі PSF. Цей формат дозволяє зберігати шрифт разом з табличкою перекодування кодової сторінки в UNICODE. Отже, потребуємо два компоненти - табличку перекодування в UNICODE (UTF-16) та шрифт в форматі знакогенератора. Оскільки йдеться про власну кодову сторінку, то табличку ми зробимо самостійно. Формат буде тривіальним - 256 рядків текстового файла відповідають 256 символам (тобто 1 рядок відповідає 0 символу, 2 рядок - 1 символу і т.ін.). Код UTF-16 записується в шістнадцятковому кодуванні (4 символа), а одразу за ним іде кінець рядка. Далі такі файли будемо називати файлами формату .cp. Назвемо наш файл mypage.cp.

Для виготовлення консольного шрифта потрібна табличка перекодування в іншому форматі, яку ми виготовимо з файла .cp за допомогою команди:

gawk -f ucp.awk < mypage.cp > mypageU.cp

де ucp.awk містить

BEGIN   {ORS="";i=0;}
        {printf("0x%02X U+%s\n",i,$0);i++;}

Тепер нам знадобиться шрифт в форматі знакогенератора. Всі шрифти в цьому форматі описують матрицю розміром 8xN, де N теоретично коливається від 1 до 32. Практично воно має значення 16, 14 або 8. За допомогою утиліти SVGATextMode можна встановити нестандартний режим монітора, в якому N може бути якимось іншим, але навіть в цій утиліті перевага надається стандартним розмірам символів - там є купа нестандартних режимів, але переважна більшість з них потребують шрифтів 8x8, 8x14 або 8x16. Існує ще один трюк - так звані шрифти 9xN, але насправді вони теж описуються матрицею 8xN. Все, чого ми досягаємо з цими шрифтами - праворуч від кожного символа додається порожній ствпчик шириною в 1 піксел. Це призводить до розриву псевдографіки, зате значно покращує якість змістовних символів - дизайнери шрифтів спеціально залишають 8 стовпчик символа порожнім (крім псевдографіки) для того, щоб на екрані вони не зливалися. В цьому випадку це не потрібно, отже можна використовувати додатковий стовпчик, що позитивно позначиться на якості. Але таких шрифтів вкрай мало, можливо їх доведеться робити з нуля.

Хоча пропонований метод дозволяє самостійно малювати шрифти, цього робити не рекомендується через працеємність. Слід скористатись вже готовими шрифтами, які є в Linux або Windows. Шрифти Linux доступні як у форматі знакогенератора (це видно за характерними розмірами файлів: 8x16 - 4096, 8x14 - 3584, 8x8 - 2048), так і в PSF (звичайно, спочатку треба розпакувати їх, якщо вони стиснуті gzip!).

Випадок з файлами PSF зводиться до випадку з файлами знакогенератора за допомогою команд:

psfstriptable <файл.psf> <файл1.psf>
dd if=<файл1.psf> of=<результат> bs=1 skip=4

де <результат> і є файлом в форматі знакогенератора. Тепер нам потрібна табличка перекодування в форматі .cp для ЦЬОГО ШРИФТА (не плутати з табличкою того кодування, яке ми хочемо отримати в результаті - її ми вже зробили!).

Якщо така табличка була в <файл.psf>, отримаємо її за допомогою команди

psfgettable <файл.psf> <табличка перекодування>

Якщо її там не було, або шрифт одразу в форматі знакогенератора, доведеться виконати марудну роботу - проставляти коди символів (це буде згодом, а поки що слід підсунути табличку, в якій кожному символу відповідає код FFFF). Якщо табличка там була, її слід привести до формату .cp в будь-якому текстовому редакторі (ну не вистачило мене писати для цього утиліту...).

Щоб взяти шрифти з Windows 9x/ME, треба взяти файли EGA.CPI, EGA2.CPI, EGA3.CPI та ISO.CPI в каталозі \WINDOWS\COMMAND. Аналогічний файл у Windows NT, Windows 2000 та Windows XP (в останній не пробував) називається EGA.CPI і лежить в \WINNT\SYSTEM32. На них треба напустити саморобні утиліти win95cpi та winntcpi.

Коли в командному рядку такої утиліти поставити тільки ім'я файла, скажімо

./win95cpi EGA3.CPI

то отримаємо список кодових сторінок в файлі .CPI

437
775
850
852
855
866

Коли другим аргументом в командному рядку вказуємо кодову сторінку,

./win95cpi EGA3.CPI 866

то отримаємо файли 866.8x16, 866.8x14 та 866.8x8, що є шрифтами в форматі знакогенератора. Щоб до них отримати ще й таблиці перекодування, беремо з Windows відповідні файли типу .NLS. Скажімо, для Windows 9x/ME файл називається CP_866.NLS і лежить в \WINDOWS\SYSTEM, для Windows NT, Windows 2000 та Windows XP - C_866.NLS в \WINNT\SYSTEM32. Далі на них напускаємо утиліти ./win95nls та ./winntnls відповідно. Єдиний аргумент командного рядка - ім'я файла, табличка перекодування пишеться на стандартний вихід.

Отже, в результаті цієї марудної роботи маємо купу чужих шрифтів і табличок перекодування до них. І навіщо? А для того, щоб створити велику бібліотеку екранних шрифтів за допомогою саморобної утиліти bsf2tsf:

./bsf2tsf 866.8x16 866.cp>>fonts.16
./bsf2tsf 437.8x16 437.cp>>fonts.16
...
./bsf2tsf 866.8x14 866.cp>>fonts.14
./bsf2tsf 437.8x14 437.cp>>fonts.14
...

Навіщо нам бібліотека? Ось простий приклад. Скажімо, ми хочемо створити екранний шрифт для кодування 1251. Але таке кодування для консолі не застосовується, отже в чистому вигляді його "позичити" намає де. Якщо візьмемо за основу 866, то отримаємо тільки російську кирилицю і псевдографіку (яка у 1251 не потрібна). В результаті маємо величезну дірку, бо символи 128-159, 163, 165-167, 169, 171-174, 177-182 та 187-190 відсутні (загалом 50 штук). Їх довелося б малювати вручну, якби не наявність файлів з іншими шрифтами (наприклад, додавання до бібліотеки тільки кодування 869 вирішує проблему 9 з 50 символів, 855 - ще 20, 850 дає 2). Таким чином уникаємо зайвої роботи і малюємо тільки 19 символів замість 50.

Файли типу fonts.16 є текстовими і складаються з таких блоків

=0002,16
........
........
.OOOOOO.
OOOOOOOO
OO.OO.OO
OOOOOOOO
OOOOOOOO
OO....OO
OOO..OOO
OOOOOOOO
OOOOOOOO
.OOOOOO.
........
........
........
........
=0004,16
........
........
........
........
........
...O....
..OOO...
.OOOOO..
OOOOOOO.
.OOOOO..
..OOO...
...O....
........
........
........
........
........

Матриця з зображенням кожного символа починається з рядка =, в якому вказується шіснадцятковий код символа в UTF-16 та, через кому, кількість рядків (яка відповідає вертикальному розміру шрифта). Далі йде сама матриця, яка, сподіваюсь, не потребує пояснень. Порожні рядки, коментарі і т.ін. в цьому форматі не передбачені. На цьому етапі починається ручна роботи по домальовуванню символів, яких не вистачає та виправленню кодів UTF-16, якщо вони не були коректно задані на початку.

Час від часу слід робити спроби згенерувати шрифт за допомогою утиліти compose:

./compose font.16 mypage.cp > mypage.8x16

Слід відзначити, що наявність розширення 16 (14, 8 чи якогось іншого розміру) у файлі font.16 є обов'язковою. На стандартиний вихід виводиться сам шрифт, а на стандартний вихід помилок ця утиліта направляє повідомлення виду:

135 unmapped
139 unmapped
178 unmapped
179 unmapped
180 unmapped
181 unmapped

Це означає, що відповідні символи були відсутні в бібліотеці і їм в шрифті знакогенератора буде відповідати порожній символ (як пробіл - ASCII 32). Думаю, зайвим буде нагадувати, що шрифт вийшов добрим, коли жодного такого повідомлення не виявиться. Хоча це ще не означає, що шрифт вийшов добрим візуально, а свідчить лише про повну відповідність кодуванню. (Шрифт, поданий тут, свідомо зроблено гидотним, щоб заохотити читачів покращити його, повторивши описані процедури :). Крім того, можливі помилки, коли символ намальований неправильно.

Коли зрештою шрифти в форматі знакогенератора зроблено, їх слід переробити на PSF.

echo -ne "\066\004\000\020" | cat - mypage.8x16 >mypage.8x16.psf

Четвертий байт послідовності \020 - це вісімковий запис числа 16 (отже, для інших розмірів слід це підправити).

Тепер додамо таблицю перекодування mypageU.cp, яку ми отримали раніше:

psfaddtable mypage.8x16.psf mypageU.cp mypageU.8x16.psf

Повторюємо цей процес для всіх розмірів шрифтів, які нас цікавлять.

Активуємо новий шрифт:

consolechars -f mypageU.8x16.psf
charset G0 user

і милуємось результатами важкої праці :) гидотно? Так отож! Підправляємо символи в бібліотеці шрифтів і повторюємо процес до звитяжного кінця.

Клавіатура для консолі - перевірка з ноги

Налаштування консольної клавіатури - справа дуже тонка і варта окремої уваги, оскільки справжній чоловік ніколи не використовує чужих розкладок клавіатури (а особливо властивих їм способів перемикання), а робить свою, власну.

Але нетерплячим слід всеж-таки використати чужу розкладку клавіатури, щоб побачити, що все працює як слід. Для цього слід використати розкладки для UTF. Але це зовсім не означає використання цих розкладок безпосередньо! Режим UTF не підтримується до пуття жодною консольною програмою, отже ви або будете правильно набирати символи і бачити при цьому жахливо спотворений екран, або бачити нормальний екран, але набрати кирилицю вам не вдасться (залежно від поточного режиму UTF на вашій консолі).

Отже, беремо файл з такою розкладкою, розархівовуємо його і напускаємо на нього утиліту deutfk:

./deutfk mypage.cp mypage_keymap

Таким чином, з файла utf_keymap отримуємо файл mypage_keymap, який витриманий в традиційному стилі і підлаштований під наше кодування.

Завантажуємо його:

loadkeys ./mypage_keymap

і перевіряємо працездатність клавіатури.

Друга частина марлезонського балету - підтримка ГОСТ в iconv.

Значить так:

  1. Беремо джерельні тексти libiconv (я використав libiconv-1.7)
  2. Беремо файлик з описом кодування з попереднього долучення і конвертуємо його в формат, зручний для iconv

     gawk -f iconv.awk <mypage.cp > mypage.txt
    
  3. В каталозі libiconv-1.7/tools компілюємо потрібну нам програмку:

     gcc 8bit_tab_to_h.c -o 8bit_tab_to_h
    
  4. Напускаємо її на наш файлик

     ./8bit_tab_to_h cp1125 cp1125 <mypage.txt
    

    Отриманий файл cp1125.h копіюємо в libiconv-1.7/lib

  5. В каталозі libiconv-1.7/lib вносимо зміни до файлів converters.h та encodings.def, в яких згадуємо незлим тихим словом наше нове кодування

  6. Далі робимо

     make -f Makefile.devel lib/aliases.h
     make -f Makefile.devel lib/flags.h
     ./configure ляляфафа
     make
     make install
    

Всі згадані файли є в долученні (крім кінцевого результату, звичайно).

Коментар від Володимира Лісівки : iconv-1.8 вже має підтримку CP1125, але необхідно компілювати з параметром --enable-extra-charsets для configure.

Коментар від Олега Дерибаса : Щоб нормально працювати на Windows з CP1125 рекомендую встановити ось це: 866ukr.zip. Перевірено на на WinNT і Win2k. Для 95/98 підійде пакет звідси.