Жжж… в недрах M$-Оффиса.

Posted: 2015-08-07 in IT, Software
Метки:,

Компания Microsoft — весьма неплохой производитель периферийного железа. Клавиатуры их прекрасны, а с помощью их мышки я прошёл все кваки, думы, анрылы и ещё пачку экшенов. И эта мышка до сих пор жива и прекрасно работает.
Но их софт — это какой-то лютый ахтунг. Когда-то давно я репостил одну заметку про форматы MSO, и с тех пор ничего интересного мне не попадалось. Скорее всего потому, что в моей деятельности офисные пакеты используются чрезвычайно редко, а когда они мне таки нужны — имеющегося в репозитарии либре-оффиса хвататет с головой.

Но тут я на просторах хабра откопал настолько эпичное, что не могу не поделиться.

Сперва цитаты:

во всех версиях Microsoft Excel, начиная по крайней мере с 2003 и возможно до самых новых, в имени листа не всегда можно ввести большую букву Ж. Данная проблема обсуждается в сети уже давно, например на этом форуме забавно наблюдать, как некоторые утверждают, что у них проблемы нет, а у других есть, но не всегда, и никто не понимает, почему так.

Описать нормальными словами то, что происходит в excel, когда вы просто нажимаете кнопку ‘Ж’, практически невозможно. Поэтому я попытаюсь обрисовать в целом процесс исследования, сократив его где возможно, и не слишком перегружая статью ассемблерным кодом. В итоге мы узнаем, почему получается так, что не любые символы можно ввести, и как это можно исправить.

С чего начать? Поэкспериментируем немного. Оказывается, что иногда ввести Ж в название листа всё-таки можно, причём если уж один раз это сработало, то её можно будет вводить сколько угодно и где угодно, пока не закроешь Excel. А если не получилось, то как ни старайся, ввести эту букву уже не получится никак. Выяснить, почему так происходит, пока не удаётся. Известно одно: скопипастить её можно всегда.

Раз ошибка имеется где-то в коде проверки символов, попробуем найти её через действительно запрещённый символ ‘:’. Копипастим его в название листа, нажимаем Enter, и получаем сообщение, что такие символы не допускаются. Прервём на этом месте выполнение программы. Мы попадаем куда-то в дебри системных вызовов, во главе с user32.dll, общая вложенность 22 в глубину стека.

То есть если после запуска excel при первом нажатии любой клавиши, пусть даже стрелки вниз, выбрана английская раскладка, буквы ‘Ж’ вы больше не увидите. И наоборот, если раскладка была русская, больших ‘Ж’ будет сколько угодно, а запрещённым «назначается» shift-б, и, кстати, shift-7 тоже. И после этого назвать лист, скажем, «рога & копыта» уже не получится, хотя символ ‘&’ вроде как разрешён.

Ещё раз напомню, что всё вышесказанное относится к вводу текста в названии листа, а для остальных областей экрана excel таблицы другие, некоторые по 40 и более строк. О том, что там может происходить при нажатии клавиш, лучше не думать.

Да, вы всё верно поняли. Вместо того, чтобы тупо проверить название листа на наличие недопустимых символов с помощью регулярки или простой процедуры поиска символа в строке, разработчеги из МС наворотили адов пиздец с таблицами скан-кодов, залезли на весьма низкий уровень в системе и попытались объять необъятное — учесть тонкости работы разных раскладок в куче вариантов, причем подошли к проблеме крайне извращенческим способом — со стороны скан-кодов клавиатуры. Готов утверждать, что при использовании расширенных юникодных символов в названиях листов (хангыль, иероглифы, яти и прочие узелки с рунами) в сочетании с кривыми раскладками для быстрого ввода таких глюков можно отгрести ещё пару вагонов.

«Уже сейчас видно, что это будет глючить и тормозить» (копирайт не мой :D)

Наслаждайтесь: http://habrahabr.ru/post/264313/

Реклама

Обсуждение закрыто.