Re: Строки и Unicode
Есть предположение, что в Колибри только в ядре Unicode нормальный, а качество остального сомнительно, поскольку никем не используется.
Как бы не оказалось, что единственной программой, использующей Unicode-возможности Колибри, является наш обновленный "Hello, world!", инициализирующий заголовок консоли путем к программе в UTF-8, формируемым ядром.
Ну вообще есть приложения FB2READ и TXTREAD, а ещё web-браузер, которые как бы поддерживают в какой-то степени юникод.
выяснилось, что ядро уже давно поддерживает Unicode для файловой и графической подсистем, а системный шрифт содержит символы всех языков на латинице и кириллице
Возьмём для примера UTF-8 encoded sample plain-text file
и попробуем открыть в какой-нибудь программе из-под KolibriOS.
Но там похоже используются не системные шрифты.
Хорошо, ради интереса сделаем такой тестовый пример с кусочками текста из приведённого выше файла и будем выводить с помощью системной функции
program U_Test;
uses
KolibriOS;
const
DEFAULT_CURRENT_Y = 10;
var
WndLeft, WndTop, WndWidth, WndHeight: Integer;
CurrentY: LongInt;
procedure Print(Title, Text: PAnsiChar);
begin
// draw Title as CP866
DrawText(4, CurrentY, Title, $00000070, $00FFFFFF, DT_ZSTRING + DT_CP866_8x16, 0);
Inc(CurrentY, 16);
// draw Text as UTF-8
DrawText(8, CurrentY, Text, $00000000, $00FFFFFF, DT_ZSTRING + DT_UTF8_8x16, 0);
Inc(CurrentY, 24)
end;
procedure Test;
begin
Print('Linguistics and dictionaries:', 'ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn');
Print('Mathematics and sciences:', '∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i)');
Print('APL:', '((V⍳V)=⍳⍴V)/V←,V ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈');
Print('Nicer typography in plain text files:', '‚deutsche‘ „Anführungszeichen“');
Print('Combining characters:', 'STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑');
Print('Greek (in Polytonic):', 'Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι');
Print('Georgian:', 'გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო');
Print('Russian:', 'Зарегистрируйтесь сейчас на Десятую Международную Конференцию по');
Print('Thai (UCS Level 2):', 'แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช');
Print('Ethiopian:', 'ሰማይ አይታረስ ንጉሥ አይከሰስ።');
Print('Greetings in various languages:', 'Hello world, Καλημέρα κόσμε, コンニチハ');
end;
begin
with GetScreenSize do
begin
WndWidth := 640;
WndHeight := 480;
WndLeft := (Width - WndWidth) div 2;
WndTop := (Height - WndHeight) div 2;
end;
while True do
case WaitEvent of
REDRAW_EVENT:
begin
BeginDraw;
DrawWindow(WndLeft, WndTop, WndWidth, WndHeight, 'U - test', $00FFFFFF,
WS_SKINNED_SIZABLE + WS_CLIENT_COORDS + WS_CAPTION, CAPTION_MOVABLE);
CurrentY := DEFAULT_CURRENT_Y;
Test;
EndDraw;
end;
KEY_EVENT:
GetKey;
BUTTON_EVENT:
if GetButton.ID = 1 then
Break;
end;
end.
Скриншот примера:
Прилагаю также уже скомпилированный пример U_TEST.KEX
Кстати, этот пример можно запустить в эмуляторе KEm, в нём как и в современном ядре KolibriOS поддерживается вывод UTF-8 и UTF-16LE.
Freeman: Я, похоже, испортил это сообщение. Не туда нажал. Восстановил исходник из архива, а новый текст пропал.