Страница 1 из 2

Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 07:10
Сионист
Окно создано CreateWindowW. Но если код символа в UTF16 не лезет даже в два байта, то каким образом окно может получить этот символ? Вся суррогатная пара в WPARAM? Или как?

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 09:35
Romeo
WM_CHAR
wParam
The character code of the key.

...

Remarks
The WM_CHAR message uses Unicode Transformation Format (UTF)-16.
Ну а как ещё?

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 09:46
Сионист
Вы два байта от анси не отличаете? UTF-16 тоже не равномерный, в нём есть символы по два байта, а есть символы, обозначаемые суррогатными парами по четыре байта. Вопрос: как получить символ, код которого не лезет в два байта? Не от своей экранной кнопки, там как раз просто: отправить WM_UNICHAR. А с клавиатуры?

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 09:49
Romeo
А вы short от long отличаете? В long как раз 4 байта. А wParam как раз типа long. Я что, для кого-то другого копирую сюда выжимки из MSDN, где сказано, что сообщение поддерживает UTF-16?

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 09:51
Сионист
То есть суррогатная пара целиком в WPARAM? А что надо передать в четвёртый параметр WideCharToMultiByte в случае преобразования одной суррогатной пары? Количество символов, то есть 1, или количество wchar_t, то есть 2? И как её отличить? Кстати, в WPARAM 8 байт.

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 09:55
Romeo
Ну а как по-другому, чёрт побери? Если UTF-16 поддерживается по спецификации, а так же там указано, что символ содержится в wParam?

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 10:13
Сионист
Так мало ли как он поддерживается. Может приходят два сообщения подряд с половинками суррогатной пары?

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 10:17
Romeo
Сионист писал(а): А что надо передать в четвёртый параметр WideCharToMultiByte в случае преобразования одной суррогатной пары? Количество символов, то есть 1, или количество wchar_t, то есть 2?
MSND писал(а): cchWideChar [in]
Size, in characters, of the string indicated by lpWideCharStr. Alternatively, this parameter can be set to -1 if the string is null-terminated. If cchWideChar is set to 0, the function fails.
If this parameter is -1, the function processes the entire input string, including the terminating null character. Therefore, the resulting character string has a terminating null character, and the length returned by the function includes this character.
If this parameter is set to a positive integer, the function processes exactly the specified number of characters. If the provided size does not include a terminating null character, the resulting character string is not null-terminated, and the returned length does not include this character.
Сионист писал(а):Кстати, в WPARAM 8 байт.
Ты уверен? По поводу этого ничего не могу сказать. Нужно тестить.
Сионист писал(а):Так мало ли как он поддерживается. Может приходят два сообщения подряд с половинками суррогатной пары?
Если бы это было так, то в спецификации было бы об этом сказано. Microsoft можно ругать сколько угодно и за что угодно, но документацию к API они содержат всегда в up-to-date состоянии, так как они получаются за это деньги. Привыкни верить MSDN, а не задаваться бесполезными вопросами "а что если...".

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 10:29
Сионист
Ты уверен?
Ага. Для своего случая.
По поводу этого ничего не могу сказать. Нужно тестить.
Зачем? Всего лишь выбрать в свойствах проекта компилятор нужной разрядности.
Microsoft можно ругать сколько угодно и за что угодно, но документацию к API они содержат всегда в up-to-date состоянии, так как они получаются за это деньги.
То то им пришлось делать костыль для конкретной игры, когда выяснилось, что эта игра учитывает их старый ни где не описанный, а в новой версии исправленный глюк и глючит из-за исправления глюка. Теперь винда проверяет, кто к ней обращается за системными функциями и если та самая игра, то специально глючит во избежание глюка.

Re: Каким образом приложение может получить символ ещё длиннее?

Добавлено: 17 дек 2015, 11:42
Absurd
То то им пришлось делать костыль для конкретной игры, когда выяснилось, что эта игра учитывает их старый ни где не описанный, а в новой версии исправленный глюк и глючит из-за исправления глюка. Теперь винда проверяет, кто к ней обращается за системными функциями и если та самая игра, то специально глючит во избежание глюка.
Это было в момент становления Win95, когда им серьезно угрожала OS/2 Warp от IBM. Поддержка старых приложений под ДОС типа игры СимСити о которой идет речь (не СимСити 2000, а старый СимСити под DOS4GW + SVGA) была критическим фактором удержания пользовательской базы. Только это было ровно 20 лет назад, да. С тех пор ядро у ОС от Майкрософт сменилось уже как минимум раза два или три (ЕМНИП NT, а затем Vista).