Board.KolibriOS.org
https://board.kolibrios.org/

SysFn2:GetKey
https://board.kolibrios.org/viewtopic.php?f=2&t=3433
Page 1 of 1

Author:  0CodErr [ Tue Nov 15, 2016 4:45 pm ]
Post subject:  SysFn2:GetKey

Как насчёт добавить в эту функцию поддержку Unicode?
У нас там есть ещё свободные биты для этого.
Code:
Returned value:
  * if the buffer is empty, function returns eax=1
  * if the buffer is not empty, function returns al=0,
    ah=code of the pressed key,
    bits 16-23 = contain scancode for pressed key in ASCII mode,
                 in the scancodes mode this bits cleared.
    bits 23-31 = zero
  * if there is "hotkey", function returns al=2,
    ah=scancode of the pressed key (0 for control keys),
    high word of eax contains a status of control keys at the moment
    of pressing a hotkey

То есть, можно добавить режим UNICODE. И возвращать eax = [Byte:Scan][Word:Key][Byte:0]

Author:  Pathoswithin [ Tue Nov 15, 2016 6:44 pm ]
Post subject:  Re: SysFn2:GetKey

Ну, hidnplayr был бы рад. Можно даже отдельную функцию создать. Только для этого надо сделать таблицы для всех раскладок.

Author:  CleverMouse [ Thu Nov 17, 2016 7:09 pm ]
Post subject:  Re: SysFn2:GetKey

У меня есть встречное предложение. Хватит мусорных бит: viewtopic.php?p=67209#p67209

Author:  0CodErr [ Fri Nov 18, 2016 3:59 pm ]
Post subject:  Re: SysFn2:GetKey

CleverMouse, почему именно UTF-8?
Вообще, вот есть http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings

Author:  0CodErr [ Fri Nov 25, 2016 10:18 pm ]
Post subject:  Re: SysFn2:GetKey

CleverMouse wrote:
У меня есть встречное предложение
Но ведь в этой теме обсуждается конкретно SysFn2. Разве есть необходимость с клавиатуры вводить что-то за пределами https://en.wikipedia.org/wiki/Plane_%28 ... gual_Plane ?

Ну а за UTF-16 я потому что в ней символ может состоять или из 2-ух, или из 4-ёх байтов. В то время как в UTF-8 4 варианта(1|2|3|4). Это дополнительные проверки в коде, меньше производительность. Хуже, наверное, только EBCDIC.
В плане совместимости, файловые функции уже давно поддерживают UTF-16.

Вообще, в плане эффективности, как мне кажется, UCS-2(2 байта на символ) будет ещё лучше. Проще и быстрее строковые функции. Можно элементарно обратиться к i-ому символу, а не парсить всё до него как в UTF-8\16.

Вот смотри, пусть есть StrLen для однобайтной кодировки
Code:
        mov    edi, Str
        mov    ecx, $FFFFFFFF
        xor    eax, eax
        repne scasb
        mov    eax, $FFFFFFFF
        sub    eax, ecx


Как изменится код для UCS-2? Очень просто, изменится только scasb на scasw
Code:
        mov    edi, Str
        mov    ecx, $FFFFFFFF
        xor    eax, eax
        repne scasw
        mov    eax, $FFFFFFFF
        sub    eax, ecx


А для UTF-8/16 надо больше городить, будет гораздо больше проверок. Это даже если реально там символы помещаются в рамки UCS-2.

Я вовсе не хочу сказать, что надо отказываться от поддержки UTF-8\16. Но всему должно быть своё место.
Снова скажу, что в основном всё же используется Basic Multilingual Plane. А если нужно будет перекодировать, то пусть в библиотеке будут функции UCS2<->UTF16, UCS2<->UTF8, UTF16<->UTF8.

Author:  CleverMouse [ Fri Dec 23, 2016 3:25 pm ]
Post subject:  Re: SysFn2:GetKey

http://utf8everywhere.org/
Любой код, считающий количество unicode codepoints в строке, сломан. strlen имеет смысл только как количество байт в строке, и в этом значении он остаётся абсолютно одинаковым для однобайтовых кодировок и utf-8.

Page 1 of 1 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/