1

Тема: Локализация и кодировки в KolibriOS

Если портировать CoreLite под KolibriOS, встает вопрос о кодировках. Насколько знаю, поддержки кодировок как таковой в KolibriOS нет. В русской локализованной версии используется CP866, в английской — CP437. Есть ли системная функция для определения текущей локализации? Если нет, можно ли узнать локализацию каким-либо другим образом?

Знаю, что теперь в KolibriOS есть какой-то особый тип строк с поддержкой UTF-8. Они вроде бы используются для обращений к файловой системе. Есть ли где-то документация на эти строки?

2

Re: Локализация и кодировки в KolibriOS

С кодировками мутная тема.

Есть функция

{4}       Procedure DrawText(X, Y: Integer; Text: PChar; ForeColor, BackColor, Flags, Count: Dword); StdCall; External 'KolibriOS';

она принимает во Flags спецификаторы кодировки

 (* Charset specifiers for DrawText *)
  DT_CP866_6X9         = $00000000;
  DT_CP866_8X16        = $10000000;
  DT_UTF_16LE_8X16     = $20000000;
  DT_UTF_8_8X16        = $30000000;

Путь приложения записывается ядром только в UTF-8 http://board.kolibrios.org/viewtopic.php?f=2&t=3429

Насчёт файловых путей, из документации

Можно указать кодировку строки, поместив в её начале байт со значениями:
  * 1 = cp866
  * 2 = UTF-16LE
  * 3 = UTF-8
иначе будет использоваться кодировка cp866. В абсолютном пути можно
поместить этот байт после '/' или добавить дополнительный '/' перед ним.

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

Ещё есть эти функции

{21.5}    Function  SetSystemLanguage(SystemLanguage: Dword): Integer; StdCall; External 'KolibriOS';

* Язык системы - глобальная системная переменная, никак
    не используемая самим ядром, однако приложение @taskbar рисует
    соответствующую иконку.
  * Проверок на корректность не делается, поскольку ядро эту
    переменную не использует.

{21.2}    Function  SetKeyboardLayoutCountry(Country: Dword): Integer; StdCall; External 'KolibriOS';

* Идентификатор страны - глобальная системная переменная, которая
    самим ядром не используется; однако приложение @taskbar отображает
    соответствующую текущей стране иконку.
  * Приложение @taskbar переключает раскладки по запросу пользователя.

Некоторые программы ещё используют библиотеку iconv.obj для перекодировки.

3

Re: Локализация и кодировки в KolibriOS

0CodErr пишет:
{21.5}    Function  SetSystemLanguage(SystemLanguage: Dword): Integer; StdCall; External 'KolibriOS';

А есть функция GetSystemLanguage? Как получить доступ к установленной переменной?

4

Re: Локализация и кодировки в KolibriOS

В KolibriOS.pas ведь есть

{26.5}    Function  GetSystemLanguage: Dword; StdCall; External 'KolibriOS';

вроде только @taskbar это использует.

5

Re: Локализация и кодировки в KolibriOS

Freeman пишет:

В русской локализованной версии используется CP866, в английской — CP437.

Могу ошибаться, но за время использования Колибри в разработке показалось, что CP866 прошита в ядре и используется всегда. Как тогда существуют испанская и итальянская локализации? Что с диакритиками? Как выглядит слово Español, например?

6

Re: Локализация и кодировки в KolibriOS

Насколько понял, для испанской версии на этапе компиляции подключается свой шрифт в конце этого файла

font1:
  if lang eq sp
  file 'gui/char_sp.mt'
  else if lang eq et
  file 'gui/char_et.mt'
  else
  file 'gui/char.mt'
  end if

7

Re: Локализация и кодировки в KolibriOS

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

8 (изменено: 0CodErr, 22.06.2023 в 12:19)

Re: Локализация и кодировки в KolibriOS

Freeman пишет:

кодировка Колибри фактически определяется шрифтом?

Вряд ли из-за шрифта поменяется сама кодировка.
Испанская версия изначально вообще не поддерживалась.
К тому же, в документации из 8-битных кодировок ничего другого кроме CP866 не указано.
Учитывая, что основы KolibriOS были заложены в дистрибутиве Menuet RE(RE – Russian Edition), такая кодировка кажется вполне логичной.