Что значит пароль должен содержать буквы верхнего и нижнего регистра

Пароль должен содержать буквы разных регистров — как его придумать и создать?

При регистрации на сайтах от пользователей зачастую требуют придумать такой пароль, который бы содержал в себе буквы разных регистров (т.е. не только строчных, но и прописных). Для чего это нужно? Каким должен быть пароль, отвечающий современным требованиям безопасности работы в сети, и как его создать? Ответим на эти вопросы.

Зачем в пароле буквы разных регистров?

Компьютерные программы или даже целые операционные системы относятся к буквам по-разному. Например, в Windows в одной и той же папке нельзя хранить файлы (или другие папки) с одинаковыми именами, независимо от того, как они написаны — большими (в верхнем регистре), маленькими (в нижнем регистре) или и большими, и маленькими буквами любого алфавита. К примеру, рядом с файлом «Документ.doc» нельзя создать файл «документ.doc» или «ДОКУМЕНТ.DOC» — системой оба названия являются одинаковыми. А вот в Linux и основанных на ней операционных системах (к примеру, Ubuntu) в одну и ту же папку можно разместить файлы/папки с одинаковыми именами, если в них используются буквы разных регистров. Т.е. для Linux файлы «документ.doc» и «ДОКУМЕНТ.DOC» являются совершенно разными.

Примерно то же самое можно сказать и о паролях. Каждый символ в пароле имеет свой уникальный код. И код этот отличается для большой буквы «А» и для строчной «а». И благодаря этому, как минимум, вдвое увеличивается устойчивость парольной фразы к взлому методом перебора, т.е. к брутфорс-атакам либо атакам по словарю.

Для справки — брутфорс-атака предполагает поочередный перебор всех возможных символов, из которых может быть создан пароль. Если бы защищенная паролем веб-система (файл, программа, сайт и т.д.) одинаково воспринимала бы и большие и маленькие буквы, тогда список возможных символов для перебора сократился бы на 26 единиц (при использовании в пароле английских букв). Кажется, что это немного. Но если пароль состоит из 10 знаков, то в сумме эти 26 больших букв создают дополнительные варианты написания парольной фразы. А чем больше вариантов, тем сложнее пароль взломать.

Какой пароль может считаться надежным?

Исходя из вышесказанного, пароль, в котором присутствуют и большие, и маленькие буквы — однозначно, в разы надежнее парольной фразы, состоящей из буквы только в верхнем или только в нижнем регистре. Однако наличие обоих разновидностей букв не делают пароль отвечающим современным требованиям кибербезопасности. Он также должен:

Существуют и другие требования к создаваемым паролям, но приведенные выше — такие, которыми нельзя пренебрегать.

Как создать сложный пароль?

Создать пароль с маленькими и большими буквами можно вручную (вот подробная инструкция) либо при использовании специализированных на этом программ — генераторов сложных паролей. При самостоятельном создании сложного пароля можно, например, использовать такой простой способ:

В нашем случае получился довольно длинный пароль, состоящий из 23 знаков. Если система не позволяет использовать такие длинные парольные фразы, просто удалите некоторые символы.

1. Генерация пароля (или одновременно нескольких — вплоть до 50 штук) по параметрам. Просто задаем желаемую длину (до 30 знаков), затем указываем программе, какие символы использовать в пароле — цифры, спецсимволы, русские/английские буквы в верхнем/нижнем регистре:

Что значит пароль должен содержать буквы верхнего и нижнего регистра

2. Создание пароля на основе введенной фразы, закодированной посредством алгоритма шифрования Base64. Довольно интересная функция. Нам нужно ввести в соответствующее поле программы любую фразу (можно даже любые символы, доступные на клавиатуре), после чего утилита, используя алгоритм Base64, сгенерирует надежный пароль.

Что значит пароль должен содержать буквы верхнего и нижнего регистра

3. Создание пароля путем кодирования введенной фразы алгоритмом ROT47. Функция, аналогичная предыдущей, но в результате шифрования в парольной фразе будут присутствовать спецсимволы.

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Заметим, что шифрование одной и то же фразы алгоритмами Base64 и ROT47 всегда приводит к одному и тому же результату, независимо от того, выполняется ли кодирование в программе AZPassword или где-либо еще (например, на каком-нибудь сайте). Эта особенность метода позволяет быстро генерировать пароль непосредственно перед его вводом в форму авторизации на сайте, в компьютерной системе и т.д. Достаточно лишь точно вписать фразу (последовательность символов), на основе которой был изначально сгенерирован пароль.

Для надежного хранения паролей рекомендуем использовать систему MultiPassword :

Источник

Почему пароль должен содержать буквы разных регистров?

Во время регистрации на многих сайтах пользователи сталкиваются с необходимостью создания пароля, в котором должны присутствовать буквы, как в верхнем, так и в нижнем регистре (т.е. заглавные и строчные). С чем связано это требование? Как создать пароль, который удовлетворит не только это, но и все прочие требования кибербезопасности?

зачастую требуют придумать такой пароль, который бы содержал в себе буквы разных регистров (т.е. не только строчных, но и прописных). Для чего это нужно? Каким должен быть пароль, отвечающий современным требованиям безопасности работы в сети, и как его создать? Ответим на эти вопросы.

Пароль должен содержать буквы разных регистров — что это значит?

Начнем с базовых понятий. Любые отображаемые компьютером на экране буквы и символы имеют свой уникальный код. Одна и та же буква в верхнем и нижнем регистре в «понимании» компьютера — совершенно разные символы. Конечно, многое зависит от программного обеспечения. Оно может быть настроено так, что одна и та же буква в разных регистрах будет восприниматься компьютером одинаково (просто программа автоматически конвертирует большую букву в строчную). Но мы эти моменты рассматривать не будем.

В случае с паролями наблюдается та же картина — каждый символ в нем имеет свой уникальный код. И этот код будет отличаться для одной и той же буквы, напечатанной в верхнем и нижнем регистре. Т.е. 26 букв английского алфавита умножаем на 2 и получаем уже 52 буквы, из которых можно придумать парольную фразу. Вместе с этим на несколько порядков увеличивается и общее количество уникальных паролей, что можно составить из 52-х букв. Главный вопрос здесь — в чем смысл? А смысл в том, что чем больше возможных комбинаций парольной фразы можно придумать, тем сложнее его подобрать методом перебора, т.е. взломать.

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Подобные способы взлома предполагают перебор всех возможных символов, из которых может состоять пароль. Если бы защищенный паролем объект (не только сайт, но и какой-нибудь архив или PDF-документ) одинаково воспринимал бы и прописные и строчные буквы, тогда список возможных символов для перебора был бы в разы короче, чем в случае, когда большие и маленькие буквы воспринимаются им (защищенным объектом) как разные символы.

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

Основные требования к надежному паролю

Наличие букв в верхнем и нижнем регистре еще не делает пароль соответствующим всем современным требованиям кибербезопасности, а их довольно много. Вот основные:

Вообще, правил для создания надежного пароля — довольно много. Но приведенные выше требования, особенно первые два — базовые, и ими нельзя пренебрегать.

Как создать надежный и запоминающийся пароль?

Создать сложный (т.е. устойчивый к взлому) и одновременно запоминающийся пароль можно самостоятельно либо при использовании специализированных программ — генераторов паролей. При самостоятельном создании парольной фразы можно, например, прибегнуть к следующему простому способу:

В итоге, мы получили 14-значный пароль, в котором присутствуют и большие, и маленькие буквы, и спецсимволы, и цифры. И его довольно просто запомнить — начинается с «02», «доброе утро» английскими буквами через дефис (первая и последняя буквы — прописные), заканчивается восклицательным знаком «!».

Что значит пароль должен содержать буквы верхнего и нижнего регистра1

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Заметим, что шифрование одной и то же фразы алгоритмами Base64 и ROT47 всегда приводит к одному и тому же результату, независимо от того, где именно выполняется ли кодирование — в программе AZPassword, на сайте с аналогичной функцией, мобильном приложении и т.д. Эта особенность позволяет быстро генерировать пароль непосредственно перед его вводом в форму авторизации на сайте, форму разблокировки архива, PDF-документа и т.п. Достаточно лишь точно вписать фразу, на основе которой был изначально сгенерирован пароль.

Остались вопросы, предложения или замечания? Свяжитесь с нами и задайте вопрос.

Источник

Что значит «пароль должен содержать символы в верхнем и в нижнем регистре»?

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Что значит пароль должен содержать буквы верхнего и нижнего регистра

В данном случае под верхним регистром подразумеваются именно большие прописные буквы. Тогда как говоря о нижнем регистре, подразумевают строчные буквы. Так вот в данном случае надпись означает тот факт, что для большей надёжности пароля нужно использовать при его создании и маленькие и большие буквы.

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Чтобы написать буквы верхнего регистра (заглавные или прописные), нужно на клавиатуре нажать клавишу Shift.

Чтобы написать буквы нижнего регистра, ничего дополнительно нажимать не нужно, это обычные строчные буквы.

То есть, если система требует, чтобы в пароле были символы в верхнем и нижнем регистре, это значит, он должен содержать и прописные (большие) буквы, и строчные (маленькие).

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Такое требование в виде таблички часто появляется при регистрации на каком-либо сайте или ресурсе, при создании персонального аккаунта или электронной почты, если введенный вами пароль достаточно слабый и его легко взломать хакерам.

Именно поэтому для усиления пароля надо комбинировать и обычные знаки и буквы, которые расположены на клавиатуре. и те знаки и буквы. которые нам становятся доступными при нажатии клавиши Shift или Caps Lock. Это не только заглавные буквы, но и многие символы.

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

Что значит пароль должен содержать буквы верхнего и нижнего регистра

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

Если не хочется придумывать сложный пароль самому, то его можно сгенерировать на спецальном сайте

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Это означает, что Вам следует придумать более сложный пароль для вашей регистрации на ресурсе, он должен содержать как строчные, так и заглавные буквы латинского или русского алфавита. Например: «БольШойВопроС2016» или то же самое латиницей.

Данный способ позволит защитить вашу учетку гораздо эффективнее от взломов. Единственный недостаток такого пароля, что вы сами его можете не запомнить и запямятовать. Поэтому я уже давно завела для себя маленький блокнот, в котором я веду учет всех своих паролей, логинов и аккаунтов, так гораздо проще потом вспоминать и не надо судорожно восстанавливать пароли на электронку или вспоминать контрольные вопросы (если они есть в вашем случае)

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Должны быть заглавные буквы к примеру А и обычные к примеру а

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Но, участились попытки взломов и похищений аккаунтов, и теперь, многие сайты требуют использовать верхний и нижний регистр:

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Пароль должен содержать заглавную (хотя бы одну) букву, а также цифры.

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Это значит, что ваш пароль должен состоять и с маленькими буквами и с заглавными. Чтобы прописать буквы заглавные нужно удерживать клавишу shift и нажимать на букву, которую вам надо. Также вы можете включить клавишу Caps lock и у вас будут заглавные буквы.

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Пароль с символами в верхнем и нижнем регистре позволит обезопасить ваш аккаунт от взломщиков. Такой пароль должен содержать заглавные буквы и прописные, цифры или специальные символы, которые находятся в верхнем регистре цифровой клавиатуры. Например АпЕ_45*_о

Источник

Что такое верхний и нижний регистр на клавиатуре?

Бесплатный генератор паролей онлайн

Здесь вы можете бесплатно сгенерировать (создать) пароль любой длины и уровня сложности для ваших приложений, аккаунтов, соц. сетей, паролей к Windows, зашифрованным архивам и т.д.

Что такое пароль?

Пароль – это секретный набор символов, который защищает вашу учетную запись.

Это что-то вроде пин-кода от пластиковой карточки или ключа от квартиры, автомобиля. Он должен состоять только из латинских букв и/или цифр. Никаких знаков препинания и пробелов. Регистр букв тоже имеет значение. То есть если присвоен пароль, в котором присутствует большая (заглавная) буква, но при его наборе пользователь печатает маленькую, то это будет ошибкой – в аккаунт его не пустят.

Пароль должен быть сложным! В идеале он должен состоять минимум из десяти знаков, среди которых есть цифры, большие и маленькие буквы. И никаких последовательностей – всё в разброс. Пример: Yn8kPi5bN7

Чем проще пароль, тем легче его взломать. И если это произойдет, взломщик получит доступ к аккаунту. Причем, Вы об этом, скорее всего, даже не узнаете. А вот человек сможет, например, прочитать Вашу личную переписку или даже поучаствовать в ней.

Один из самых частых паролей, который указывают пользователи при регистрации – год рождения. Подобрать такой «ключ» совсем несложно. Еще очень часто используют набор цифр или букв клавиатуры, расположенных по порядку (типа 123456789 или qwerty).

Как придумать сложный пароль?

Обязательные требования к надежному паролю

Пароль не должен содержать

Есть несколько эффективных способов придумать надежный пароль:

Сложновато? Зато пароль, который Вы придумаете таким способом, будет надежным.

Защита пароля

Для офисных приложений

Еще один способ изменения заглавных и прописных символов реализован в офисном пакете компании «Microsoft». Наиболее часто его используют в текстовом процессоре «Ворд». В процессе ввода вы забыли случайно перейти с больших букв к маленьким или наоборот? Символы верхнего и нижнего регистров в данном случаем можно изменить следующим образом. Выделяем необходимый фрагмент текста либо с помощью левой кнопки мышки, либо с применением «Shift» и клавиш управления курсором. Далее в панели инструментов «Главная» находим подраздел «Шрифт». В нем есть кнопка для смены регистра. На ней изображены большая и маленькая буквы «а». Кликаем на ней левой кнопкой мышки один раз. Выпадет меню, в котором нужно выбрать нужный нам пункт. Например, если ввели прописные, а нужны строчные, то выбираем пункты «Изменить регистр» или «Все строчные». Независимо от выбора результат будет идентичный – все буквы в выделенном фрагменте станут «маленькими». Этот метод можно использовать только в офисном пакете компании «Микрософт», и только на тексте, который введен в компьютер.

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Длительный набор

Верхний и нижний регистр клавиатуры могут быть переключены и другим методом. Для этих целей есть специальный ключ «Caps Lock». Он обычно расположен в крайнем левом ряду клавиатуры между клавишами «Tab» и «Shift». При его нажатии происходит постоянная смена регистра. Для определения текущего режима смотрим на светодиод на клавиатуре с точно такой же надписью — «Caps Lock». Если он горит, то это означает, что вводятся заглавные буквы, иначе – строчные. Для перехода из одного режима в другой нажимаем этот ключ еще раз. Этот способ лучше всего применять тогда, когда необходимо постоянно набирать текст в одном формате (например, только прописные символы), а переключение между форматом ввода если и происходит, то не настолько часто.

Что значит пароль должен содержать буквы верхнего и нижнего регистра

Кратковременное переключение

Теперь мы знаем, что такое верхний и нижний регистр на клавиатуре. Разберемся с основными способами переключения между «большими» и «маленькими» буквами. Существует кратковременное и постоянное переключение. Еще один способ программно реализован в офисном обеспечении. Он также будет рассмотрен в рамках данного материала. Начнем с кратковременного. На каждой компьютерной клавиатуре есть клавиша «Shift» (на некоторых из них вместо надписи может быть изображена стрелочка вверх). Если в данный момент времени вводятся заглавные буквы, то при нажатии этой клавиши в сочетании с любым текстовым символом появиться он в нижнем регистре, и наоборот. Этот способ удобно использовать в начале предложения. То есть ввели прописной символ, а затем все набирается уже в строчном формате.

Источник

Правда о регистре символов, которую должны знать программисты

На конференции North Bay Python в 2018 году я делал доклад об именах пользователей. Информация из доклада по большей части была собрана мною за 12 лет поддержки django-registration. Этот опыт дал мне гораздо больше знаний, чем я планировал получить, о том, насколько сложными могут быть «простые» вещи.

В начале доклада я, правда, упомянул, что это не будет очередное разоблачение из серии «заблуждения по поводу Х, в которые верят программисты». Таких разоблачений можно найти сколько угодно. Однако мне подобные статьи не нравятся. В них перечисляются разные вещи, якобы являющиеся ложными, однако очень редко объясняется – почему это так, и что нужно делать вместо этого. Подозреваю, что люди просто прочтут такие статьи, поздравят себя с этим достижением, и потом пойдут находить новые интересные способы делать ошибки, не упомянутые в этих статьях. Всё потому, что они на самом деле не поняли проблем, порождающих этих ошибки.

Поэтому в своём докладе я постарался как можно лучше объяснить некоторые проблемы и пояснить, как их решать – такой подход мне нравится гораздо больше. Одна из тем, которой я коснулся лишь вскользь (это был всего один слайд и пара упоминаний на других слайдах) – это сложности, которые могут быть связаны с регистром символов. Для задачи, которую я обсуждал – сравнение идентификаторов без учёта регистра – есть официальный Правильный Ответ™, и в докладе я дал лучшее из известных мне решений, использующее только стандартную библиотеку Python.

Однако я кратко упомянул о более глубоких сложностях с регистром символов в Unicode, и хочу посвятить некоторое время описанию подробностей. Это интересно, и понимание этого может помочь вам принимать решения при проектировании и написании кода, обрабатывающего текст. Поэтому предлагаю вам нечто противоположное статьям «заблуждения по поводу Х, в которые верят программисты» – «правда, которую должны знать программисты».

И ещё одно: в Unicode полно терминологии. В данной статье я буду использовать в основном определения «верхний регистр» и «нижний регистр», поскольку стандарт Unicode использует эти термины. Если вам нравятся другие термины, вроде строчная/прописная буквы – всё нормально. Также я часто буду использовать термин «символ», который некоторые могут счесть некорректным. Да, в Unicode концепция «символа» не всегда совпадает с ожиданиями людей, поэтому часто лучше избегать её, используя другие термины. Однако в данной статье я буду использовать этот термин так, как он используется в Unicode – для описания абстрактной сущности, о которой можно делать заявления. Когда это важно, для уточнения я буду использовать более конкретные термины типа «кодовой позиции» [code point].

Регистров бывает больше двух

Носители европейских языков привыкли к тому, что в их языках регистр символов используется для обозначения конкретных вещей. К примеру, в английском [и русском] языках мы обычно начинаем предложения с буквы в верхнем регистре, а продолжаем чаще всего буквами в нижнем регистре. Также имена собственные начинаются с букв в верхнем регистре, и многие акронимы и аббревиатуры записываются в верхнем регистре.

И мы обычно считаем, что регистров существует всего два. Есть буква «А», и есть буква «а». Одна в верхнем, другая в нижнем регистре – не правда ли?

Однако в Unicode есть три регистра. Есть верхний, есть нижний, и есть титульный регистр [titlecase]. В английском языке так записываются названия. Например, «Avengers: Infinity War». Обычно для этого первая буква каждого слова просто пишется в верхнем регистре (и в зависимости от разных правил и стилей, некоторые слова, например, артикли, не пишутся с заглавных букв).

В стандарте Unicode дан такой пример символа в титульном регистре: U+01F2 LATIN CAPITAL LETTER D WITH SMALL Z. Выглядит он так: Dz.

Подобные символы иногда требуются для обработки негативных последствий одного из ранних решений разработки стандарта Unicode: совместимости с существующими текстовыми кодировками в обе стороны. Для Unicode было бы удобнее составлять последовательности при помощи имеющихся у стандарта возможностей по комбинированию символов. Однако во многих уже существующих системах уже были отведены места для готовых последовательностей. К примеру, в стандарте ISO-8859-1 («latin-1») у символа «é» есть готовая форма, имеющая номер 0xe9. В Unicode предпочтительнее было бы писать эту букву при помощи отдельной «е» и знака ударения. Но для обеспечения полной совместимости в обе стороны с такими существующими кодировками, как latin-1, в Unicode также назначены кодовые позиции для готовых символов. К примеру, U+00E9 LATIN SMALL LETTER E WITH ACUTE.

Хотя кодовая позиция этого символа совпадает с его байтовым значением из latin-1, полагаться на это не стоит. Вряд ли кодирование символов в Unicode сохранит эти позиции. К примеру, в UTF-8 кодовая позиция U+00E9 записана в виде байтовой последовательности 0xc3 0xa9.

И, конечно, в уже существующих кодировках есть символы, которым требовалось особое обхождение при использовании титульного регистра, из-за чего они были включены в Unicode «как есть». Если хотите посмотреть на них, поищите в своей любимой базе Unicode символы из категории Lt («Letter, titlecase»).

Есть несколько способов определить регистр

Если вы работаете с ограниченным подмножеством символов (конкретно, с буквами), то вам может хватить и 1-го определения. Если ваш репертуар шире – в него входят похожие на буквы символы, не являющиеся буквами, вам может подойти 2-е определение. Его рекомендует и стандарт Unicode, §4.2:

Программистам, манипулирующим строками в Unicode, стоит работать с такими строковыми функциями, как isLowerCase (и её функциональным родственником toLowerCase), если они не работают со свойствами символов напрямую.

Упомянутая здесь функция определяется в §3.13 стандарта Unicode. Формально в 3-м определении используются функции isLowerCase и isUpperCase из §3.13, определяемые в терминах фиксированных позиций в toLowerCase и toUpperCase соответственно.

Если в вашем языке программирования есть функции для проверки или преобразования регистра строк или отдельных символов, стоит изучить, какие из упомянутых определений используются в реализации. Если вам интересно, то методы isupper() и islower() в Python используют 2-е определение.

Нельзя понять регистр символа по его внешнему виду или названию

По внешнему виду многих символов можно понять, в каком они регистре. К примеру, «А» находится в верхнем регистре. Это понятно и по названию символа: «LATIN CAPITAL LETTER A». Однако иногда такой метод не работает. Возьмём кодовую позицию U+1D34. Выглядит она так: ᴴ. В Unicode ей назначено имя: MODIFIER LETTER CAPITAL H. Значит, она в верхнем регистре, так?

На самом же деле она наследует свойство Lowercase, поэтому по определению №2 она находится в нижнем регистре, несмотря на то, что визуально напоминает заглавную Н, а в названии есть слово «CAPITAL».

У некоторых символов вообще нет регистра

Символ С имеет регистр тогда и только тогда, когда у С есть свойство Lowercase или Uppercase, или значение параметра General_Category равно Titlecase_Letter.

Значит, очень много символов из Unicode – на самом деле, большая их часть – регистра не имеет. Не имеют смысла вопросы об их регистре, а изменения регистра на них не действуют. Однако мы можем получить ответ на этот вопрос по определению №3.

Некоторые символы ведут себя так, будто у них несколько регистров

Из этого следует, что если вы используете определение №3, и задаёте вопрос, находится ли символ без регистра в верхнем или нижнем регистре, вы получите ответ «да».

В стандарте Unicode даётся пример (таблица 4-1, строка 7) символа U+02BD MODIFIER LETTER REVERSED COMMA (который выглядит так: ʽ). У него нет унаследованных свойств Lowercase или Uppercase, он не принадлежит к категории Lt, поэтому регистра у него нет. При этом преобразование в верхний регистр его не меняет, и преобразование в нижний регистр его не меняет, поэтому по 3-му определению он отвечает «да» на оба вопроса: «принадлежишь ли ты к верхнему регистру?» и «принадлежишь ли ты к нижнему регистру?»

Кажется, что из-за этого может возникнуть никому не нужная путаница, однако смысл в том, что определение №3 работает с любой последовательностью символов Unicode, и позволяет упростить алгоритмы преобразования регистра (символы без регистра просто превращаются сами в себя).

Регистр зависит от контекста

Можно подумать, что если таблицы преобразования регистра в Unicode покрывают все символы, то это преобразование заключается просто в поиске нужного места в таблице. К примеру, в базе данных Unicode записано, что для символа U+0041 LATIN CAPITAL LETTER A нижним регистром будет U+0061 LATIN SMALL LETTER A. Просто, не так ли?

Один из примеров, в котором этот подход не работает – греческий язык. Символ Σ — то есть, U+03A3 GREEK CAPITAL LETTER SIGMA — сопоставлен двум разным символам при преобразовании в нижний регистр, в зависимости от того, где он находится в слове. Если он стоит на конце слова, тогда в нижнем регистре он будет ς (U+03C2 GREEK SMALL LETTER FINAL SIGMA). В любом другом месте это будет σ (U+03C3 GREEK SMALL LETTER SIGMA).

Регистр зависит от локали

В разных языках правила преобразования регистра разные. Самый популярный пример: i (U+0069 LATIN SMALL LETTER I) и I (U+0049 LATIN CAPITAL LETTER I) в большинстве локалей преобразовываются друг в друга – в большинстве, но не во всех. В локалях az и tr (тюркские языки), i в верхнем регистре будет İ (U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE), а I в нижнем регистре будет ı (U+0131 LATIN SMALL LETTER DOTLESS I). Иногда правильная запись реально означает разницу между жизнью и смертью.

Сам Unicode не обрабатывает все возможные правила преобразования регистра для всех локалей. В базе данных Unicode есть только общие правила преобразования всех символов, не зависящие от локали. Также там есть особые правила для некоторых языков и составных форм – литовского языка, тюркских языков, некоторых особенностей греческого. Всего остального там нет. §3.13 стандарта упоминает это и рекомендует при необходимости вводить правила преобразования, зависящие от локали.

Один пример будет знаком англоговорящим – это титульный регистр определённых имён. «o’brian» нужно преобразовывать в «O’Brian» (а не в «O’brian»). Однако при этом «it’s» нужно преобразовывать в «It’s», а не в «It’S». Ещё один пример, который не обрабатывается в Unicode – это голландское буквосочетание «ij», которое при преобразовании в титульный регистр должно переходить в верхний регистр целиком, если стоит в начале слова. Таким образом, большой залив в Нидерландах в титульном регистре будет «IJsselmeer», а не «Ijsselmeer». В Unicode есть символы IJ U+0132 LATIN CAPITAL LIGATURE IJ и ij U+0133 LATIN SMALL LIGATURE IJ, если они вам нужны. По умолчанию преобразование регистра преобразует их друг в друга (хотя формы нормализации Unicode, использующие эквивалентность совместимости, разделят их на два отдельных символа).

Сравнение без учёта регистра требует приведения к сложенному регистру

Возвращаясь к материалу, представленному в докладе. Сложность работы с регистром в Unicode означает, что регистронезависимое сравнение нельзя проводить при помощи стандартных функций приведения к нижнему или верхнему регистру, имеющихся во многих языках программирования. Для таких сравнений в Unicode есть концепция приведения к сложенному регистру [case folding], а в §3.13 стандарта определяются функции toCaseFold и isCaseFolded.

Можно решить, что приведение к сложенному регистру похоже на приведение к нижнему регистру – но это не так. Стандарт Unicode предупреждает, что строка в сложенном регистре не обязательно будет находиться в нижнем регистре. В качестве примера приводится язык чероки – там в строке, находящейся в сложенном регистре, будут попадаться и символы в верхнем регистре.

На одном из слайдов моего доклада рекомендации Unicode Technical Report #36 реализуются на Python настолько полно, насколько это возможно. Проводится нормализация NFKC и потом для полученной строки вызывается метод casefold() (доступный только в Python 3+). И даже при этом некоторые крайние случаи выпадают, и это не совсем то, что рекомендуется для сравнения идентификаторов. Сначала плохие новости: Python не выдаёт наружу достаточно свойств Unicode для того, чтобы отфильтровать символы, которых нет в XID_Start или XID_Continue или символы, имеющие свойство Default_Ignorable_Code_Point. Насколько мне известно, он не поддерживает отображение NFKC_Casefold. Также в нём нет простого способа использовать модифицированный NFKC UAX #31§5.1.

Хорошие новости: большинство этих крайних случаев не связано с какими-либо реальными рисками безопасности, создаваемыми рассматриваемыми символами. И складывание регистра в принципе не определяется как операция, сохраняющая нормализацию (отсюда и отображение NFKC_Casefold, которое повторно нормализуется до NFC после складывания регистра). Как правило, при сравнении вас не волнует, будут ли обе строки нормализованы после предварительной обработки. Вас заботит, не противоречива ли предварительная обработка, и гарантирует ли она, что только строки, которые «должны» отличаться впоследствии, будут отличаться впоследствии. Если вас это беспокоит, вы можете вручную выполнить повторную нормализацию после сложения регистра.

Пока достаточно

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

Не будет ли наивной моя надежда на то, что другие люди перестанут писать разоблачения из серии «заблуждения по поводу Х, в которые верят программисты», и начнут уже писать статьи типа «правда, которую должны знать программисты»?

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *