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

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

17 дек 2015, 07:10

Окно создано CreateWindowW. Но если код символа в UTF16 не лезет даже в два байта, то каким образом окно может получить этот символ? Вся суррогатная пара в WPARAM? Или как?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 дек 2015, 09:35

WM_CHAR
wParam
The character code of the key.

...

Remarks
The WM_CHAR message uses Unicode Transformation Format (UTF)-16.
Ну а как ещё?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

17 дек 2015, 09:46

Вы два байта от анси не отличаете? UTF-16 тоже не равномерный, в нём есть символы по два байта, а есть символы, обозначаемые суррогатными парами по четыре байта. Вопрос: как получить символ, код которого не лезет в два байта? Не от своей экранной кнопки, там как раз просто: отправить WM_UNICHAR. А с клавиатуры?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 дек 2015, 09:49

А вы short от long отличаете? В long как раз 4 байта. А wParam как раз типа long. Я что, для кого-то другого копирую сюда выжимки из MSDN, где сказано, что сообщение поддерживает UTF-16?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

17 дек 2015, 09:51

То есть суррогатная пара целиком в WPARAM? А что надо передать в четвёртый параметр WideCharToMultiByte в случае преобразования одной суррогатной пары? Количество символов, то есть 1, или количество wchar_t, то есть 2? И как её отличить? Кстати, в WPARAM 8 байт.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 дек 2015, 09:55

Ну а как по-другому, чёрт побери? Если UTF-16 поддерживается по спецификации, а так же там указано, что символ содержится в wParam?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

17 дек 2015, 10:13

Так мало ли как он поддерживается. Может приходят два сообщения подряд с половинками суррогатной пары?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

17 дек 2015, 10:17

Сионист писал(а): А что надо передать в четвёртый параметр 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, а не задаваться бесполезными вопросами "а что если...".
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

17 дек 2015, 10:29

Ты уверен?
Ага. Для своего случая.
По поводу этого ничего не могу сказать. Нужно тестить.
Зачем? Всего лишь выбрать в свойствах проекта компилятор нужной разрядности.
Microsoft можно ругать сколько угодно и за что угодно, но документацию к API они содержат всегда в up-to-date состоянии, так как они получаются за это деньги.
То то им пришлось делать костыль для конкретной игры, когда выяснилось, что эта игра учитывает их старый ни где не описанный, а в новой версии исправленный глюк и глючит из-за исправления глюка. Теперь винда проверяет, кто к ней обращается за системными функциями и если та самая игра, то специально глючит во избежание глюка.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

17 дек 2015, 11:42

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