Page 1 of 1

SysFn2:GetKey

Posted: Tue Nov 15, 2016 4:45 pm
by 0CodErr
Как насчёт добавить в эту функцию поддержку Unicode?
У нас там есть ещё свободные биты для этого.

Code: Select all

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]

Re: SysFn2:GetKey

Posted: Tue Nov 15, 2016 6:44 pm
by Pathoswithin
Ну, hidnplayr был бы рад. Можно даже отдельную функцию создать. Только для этого надо сделать таблицы для всех раскладок.

Re: SysFn2:GetKey

Posted: Thu Nov 17, 2016 7:09 pm
by CleverMouse
У меня есть встречное предложение. Хватит мусорных бит: viewtopic.php?p=67209#p67209

Re: SysFn2:GetKey

Posted: Fri Nov 18, 2016 3:59 pm
by 0CodErr
CleverMouse, почему именно UTF-8?
Вообще, вот есть http://en.wikipedia.org/wiki/Comparison ... _encodings

Re: SysFn2:GetKey

Posted: Fri Nov 25, 2016 10:18 pm
by 0CodErr
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: Select all

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

Code: Select all

        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.

Re: SysFn2:GetKey

Posted: Fri Dec 23, 2016 3:25 pm
by CleverMouse
http://utf8everywhere.org/
Любой код, считающий количество unicode codepoints в строке, сломан. strlen имеет смысл только как количество байт в строке, и в этом значении он остаётся абсолютно одинаковым для однобайтовых кодировок и utf-8.