Занимательная статья Реймонда Чена о цифровых последовательностях после Alt+.
Давным-давно был выпущен компьютер IBM PC.
В BIOS IBM PC можно было вводить символы, которых не было на клавиатуре, удерживая клавишу Alt и набирая десятичное значение на цифровой клавиатуре. Например, вы могли ввести ñ, удерживая Alt и набирая Numpad1 Numpad6 Numpad4, а затем отпустив клавишу Alt.
Для простоты изложения в дальнейшем я буду использовать обозначение Alt+164, чтобы указать, что вы нажимаете клавишу Alt, затем последовательно набираете указанные цифры на цифровой клавиатуре, после чего отпускаете клавишу Alt.
Итак, в BIOS IBM PC, когда вы набирали Alt+…, кодовые числа воспринимались как десятичные значения байтов, а результат на экране получался от генератора символов вашей видеокарты. В Соединенных Штатах в ПЗУ генератора символов отображалось то, что мы сегодня называем Code Page 437.
Когда Windows была представлена, в США в качестве 8-битного набора символов использовался Code Page 1252, который назывался "набором символов ANSI"; старый набор символов BIOS был задним числом назван набором символов OEM. Для сохранения совместимости с MS-DOS, если вы использовали клавишу Alt в сочетании с цифровой клавиатурой, набранное вами число все равно искалось в наборе символов OEM, так что ваши кодовые числа, запомненные мускульной памятью, все еще работали. Вы могли набрать Alt+164, чтобы получить символ ñ, даже несмотря на то, что номер кода ñ в Code Page 1252 - 241, а не 164.
Если вы хотели набрать символ, у которого не было OEM-эквивалента, вы могли набрать с цифровой клавиатуры 0, чтобы указать, что вы хотите найти значение в кодовой странице ANSI. Таким образом, можно набрать Alt+0169, чтобы получить символ ©, которого не было в кодовой странице OEM. Вы также можете набрать Alt+0241, чтобы получить драгоценное ñ, используя номер кодовой точки ANSI, а не номер кодовой точки OEM.
Если вы вводили число больше 255, то и Windows, и BIOS IBM PC принимали значение за 256, поэтому набрать Alt+259 было то же самое, что набрать Alt+3. В обоих случаях вы получали OEM-код 3, который для Code Page 437 представляет собой сердечко ♥.
Если вы спросите в Интернете, как набрать некоторые из этих не-ASCII символов в Windows, вы можете увидеть людей (и большие языковые модели), которые скажут вам набрать, скажем, Alt+9731, чтобы получить юникодовского снеговика ☃. К сожалению, из того, что мы узнали выше, это не работает. Вместо этого вы получите OEM-символ, значение которого равно 9731 mod 256 = 3, или вышеупомянутое сердце ♥.
Один из клиентов сообщил, что недавнее обновление Windows нарушило его способность набирать снеговика с помощью Alt+9731. Мы объяснили, что обновление не виновато; скорее, Alt+9731 вообще не должен был создавать снеговика! Но клиент настаивал, что раньше это работало.
Более тщательное изучение проблемы выявило причину.
Видите ли, хотя это правда, что десятичное значение Alt+… берется по модулю 256, это просто поведение системы ввода Windows по умолчанию. Но некоторые элементы управления (в частности, элемент управления RichEdit) переопределяют стандартную обработку последовательности Alt+… и разбирают десятичное значение по модулю 65536, а не по модулю 256.
Это означает, что то, будет ли значение Alt+… приниматься по модулю 256, зависит от того, в какой элемент управления вы вводите текст.
По умолчанию значение берется по модулю 256, и Alt+9731 дает вам сердечко.
Но если вы используете элемент управления RichEdit, то значение Alt+… берется по модулю 65536, и Alt+9731 выдает снеговика.
Для перевода использовался DeepL.