#post-id: 8177-12-44
#original-date: 15.12.2022 Thu
#original-time: 12:44 PM
#original-day: 8177
#original-host: Win7 Ultimate SP1 (Build 7601)
Люблю всё, что вокруг беззнаковых значений в VB. Да, в VB только один беззнаковый тип – Byte, а какого-нибудь Char не существует. Остальные Integer'ы и Long'и – со знаками.
По идее, проблемы должны касаться только взаимодействия с Win32 API, но сюрпризы ждут нас и за его пределами. Например!
Как известно, юникодный символ – это два байта без знака. VB умеет работать с юникодом, внутри он достаточно юникоден и только когда сам обращается к Win32 API, использует ANSI функции. Строки в VB тоже юникодные, текст можно держать хоть на японском.
Присутствуют функции вроде Asc() и Chr(), которые позволяют получить код символа или символ по коду, которые по причине совместимость оперируют ANSI. И есть AscW() и ChrW(), которые уже оперируют юникодом. При чём Asc() и AscW() возвращают Integer, а Chr() и ChrW() принимают Long.
Думаю, проблема становится очевидна уже тут. AscW() возвращает знаковое число, а посему часть кодов будут с минусом. Например, 65035 окажется -501. Но Long в ChrW() как бы намекает на то, что отрицательные числа не принимаются, поскольку 65035 – это как раз уже Long.
И что в ChrW() передавать? Не придётся ли в случае передачи в ChrW() значения из AscW() (ну а вдруг) упражняться в переводе беззнакового значения в знаковый аналог?
Оказалось, что нет. ChrW() принимает и те, и другие значения. Тоесть вот этот код даст True: