Каким образом приложение может получить символ ещё длиннее?
Модераторы: Duncon, Hawk, Romeo, Eugie
Окно создано CreateWindowW. Но если код символа в UTF16 не лезет даже в два байта, то каким образом окно может получить этот символ? Вся суррогатная пара в WPARAM? Или как?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Вы два байта от анси не отличаете? UTF-16 тоже не равномерный, в нём есть символы по два байта, а есть символы, обозначаемые суррогатными парами по четыре байта. Вопрос: как получить символ, код которого не лезет в два байта? Не от своей экранной кнопки, там как раз просто: отправить WM_UNICHAR. А с клавиатуры?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
А вы short от long отличаете? В long как раз 4 байта. А wParam как раз типа long. Я что, для кого-то другого копирую сюда выжимки из MSDN, где сказано, что сообщение поддерживает UTF-16?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
То есть суррогатная пара целиком в WPARAM? А что надо передать в четвёртый параметр WideCharToMultiByte в случае преобразования одной суррогатной пары? Количество символов, то есть 1, или количество wchar_t, то есть 2? И как её отличить? Кстати, в WPARAM 8 байт.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Ну а как по-другому, чёрт побери? Если UTF-16 поддерживается по спецификации, а так же там указано, что символ содержится в wParam?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Так мало ли как он поддерживается. Может приходят два сообщения подряд с половинками суррогатной пары?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Сионист писал(а): А что надо передать в четвёртый параметр 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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ага. Для своего случая.Ты уверен?
Зачем? Всего лишь выбрать в свойствах проекта компилятор нужной разрядности.По поводу этого ничего не могу сказать. Нужно тестить.
То то им пришлось делать костыль для конкретной игры, когда выяснилось, что эта игра учитывает их старый ни где не описанный, а в новой версии исправленный глюк и глючит из-за исправления глюка. Теперь винда проверяет, кто к ней обращается за системными функциями и если та самая игра, то специально глючит во избежание глюка.Microsoft можно ругать сколько угодно и за что угодно, но документацию к API они содержат всегда в up-to-date состоянии, так как они получаются за это деньги.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Это было в момент становления Win95, когда им серьезно угрожала OS/2 Warp от IBM. Поддержка старых приложений под ДОС типа игры СимСити о которой идет речь (не СимСити 2000, а старый СимСити под DOS4GW + SVGA) была критическим фактором удержания пользовательской базы. Только это было ровно 20 лет назад, да. С тех пор ядро у ОС от Майкрософт сменилось уже как минимум раза два или три (ЕМНИП NT, а затем Vista).То то им пришлось делать костыль для конкретной игры, когда выяснилось, что эта игра учитывает их старый ни где не описанный, а в новой версии исправленный глюк и глючит из-за исправления глюка. Теперь винда проверяет, кто к ней обращается за системными функциями и если та самая игра, то специально глючит во избежание глюка.
2B OR NOT(2B) = FF