Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
имя почтового аккаунта — регистронезависимоНе обязательно.
с точки зрения татарскогоПричём тут татарский?
Внезапно, файловая система оказывается привязанной к какой-то кодировке (причем эта кодировка скорее всего должна быть одна). Внезапно, задача коллейшена символов друг в дружку, оказывается, требует гигантских (по меркам ядра) юникодных баз данных (которые еще и регулярно обновляются по мере введения новых символов) и не самых простых алгоритмов (вот, например, ICU — это в районе 12-15 мегабайт).
Никакой зависимости от языка и локали, никакой нормализации, никакой зависимости от фазы луны. И никаких магабайтов ICU, разумеется.Ага. Всего навсего зависимость от конкретной файловой системы (на служебный файл $upcase посмотрите). Причём поскольку путь у вас может проходить по нескольким файловым системам то этих таблиц для каждого файла может использоваться несколько. Это если мы на минуточку забудем, что у каждого файла и каталога могут быть два имени (короткое и длинное).
Не увидел по ссылке ни описания содержимого $upcase, ни даже упоминания его размера.А зачем это вам? Неужто хотите писать безопасные программы? А вот фиг вам: писатели антивирусов тоже кушать хотят.
Гуглится оно, к слову, отвратительно, так что любой информации буду рад.Да ладно вам. На первой же странице есть ссылка на статью, которая всё объясняет. Халтура, как обычно у Microsoft. Даже такой распространённый язык, как немецкий (где upcase(«ß») == «SS») поддержать нельзя.
Я описал алгоритм NTFS.Вы описали ваши фантазии на тему алгоритма NTFS.
Но, как вы заметили, поздно пить Боржоми, потому что у файлов и так два имени.Совершенно необязательно. Более того, «так хорошо вам известный» «алгоритм NTFS» включает в себя, кроме всего прочего, и вменяемую семантику тоже. Но, разумеется, поведение по умолчанию — это «Мы ♥ троянов. Разводите наших троянов».
Ну не выйдет просто так сравнить строки.Почему не выйдет? Выйдет. Было бы желание. Два ключа в реестре, небольшой хак в системную библиотеку — и ваш Git (равно как и все остальные программы, использующие FILE_FLAG_POSIX_SEMANTICS) в безопасности. И незачем морочить людям голову.
Открываешь файл с нужным флагом — и ось сама разберётся: заменить, переписать, добавить.Вы про обработку многих файлов за раз ничего не слышали? Бывает иногда, да.
Так, в довесок: вам известно много уязвимостей из-за регистра?Ну дык. Почти во всех приложениях, которые пытаются как-то интерпретировать имена файлов. JSP (там целая пачка уязвимостей разной степени стрёмности), ROR, Lighttpd и т.д. и т.п.
Вы про обработку многих файлов за раз ничего не слышали?
Про «ß» я уже писал.
Для символа «I» вы с удивлением обнаружите надпись «Turkish and Azerbaijani use U+0131 for uppercase» (ну а для «i» будет написано «Turkish and Azerbaijani use U+0130 for uppercase»). А, промежду прочим, символ «i» как-раз-таки и используется в названии каталога «.git».
Причём, что характерно, как раз большинство пользователей «не отличающих» слов «Вера» и «вера» (и ради которых, теоретически, весь сыр-бор затеяли) категорически не согласны использовать только и исключительно «faith»-пусть даже им разрешат его писать как «FaItH».
Т.е. разные языки используют разные uppercase'ы для «тех же» символов. И? Как это влияет на сравнение двух строк с учетом codepage'а?У вас в каталоге затесались
.git и .gİt. Вторая использует ту самую U+0130. Что будете делать? Учтите, что турецкий пользователь должен ожидать, что это одинаковые имена, а все остальные — что разные. В зависимости от того, что система записала в файл $upcase либо те, либо другие останутся с обманутыми ожиданиями. Более того, если кто‐то догадался записать, что toupper('i') == 'İ' (и так же для всех остальных латинских букв, имеющих свой верхний регистр в турецком языке) в $upcase, то регистронезависимое сравнение имён файлов, написанных на английском, сломается. А если нет, то сломается сравнение на турецком в данной ФС. Или вы ожидаете, что у пользователя из Турции нет ни одного файла с именем на английском языке? Можно нагородить костылей вроде toupper('İ') == 'I' && toupper('i') == 'I', но я абсолютно уверен что более опытные товарищи смогут найти пример, который не решается с помощью таких костылей в принципе.Но, с другой стороны, если это не внешний репозиторий, а просто локальный файл. Что плохого, если система позволяет запустить «mplayer „фильм1.скачано отсюда.divx“» вместо «MPlayer „Фильм1.Скачано Отсюда.DivX“» с учетом текущей локали?Давайте вы расскажете, как вы видите практическое воплощение вашего запроса, а я скажу, почему так делать не надо. Автодополнение можно, нужно и уже научили игнорировать регистр, если пользователь не против. Можно сделать такое же автодополнение в диалоге открытия файлов. Но попытка сделать что‐то подобное в системной функции открытия файла обязательно приведёт как минимум к коллизиям имён: у нас есть два файла
input.tXt и input.TxT. Какой надо открыть, если у нас спросили input.txt (почему ФС не должна быть регистронезависимой уже обсудили, поэтому считаем, что она регистрозависимая и существование таких файлов возможно)? Можно нагородить кучу условий для обхода таких ловушек в такой функции, но из‐за их существования с регистрозависимой ФС регистронезависимая функция открытия файлов непременно будет тормозить.А эссет есть на клавиатуре?
в проекте внезапно не будет бардака вида:Не совсем понимаю, как бардак с именованием файлов связан с или может быть устранён регистрозависимой файловой системой.
— qwindowtext.cpp
— qWindowText.h
— QtSocketHandler.cpp
— QTSocketWritehandler.cpp
— qtSocketReadHandler.cpp
— qtsocketaccess.h
Внезапно, коллейшен часто зависит не только от кодировки, а еще и от языка и локали (например, с точки зрения немецкого «Mael» = «mäl», а с точки зрения татарского — это два совершенно разных слова).Это не совсем так. В немецком языке "ä" не равно «ae», «ae» — это допустимая транслитерация символа "ä" (примерно как в русском используют «е» вместо «ё» или иногда апостроф вместо твёрдого знака — «под'ём» — вас скорее всего поймут правильно, но это же не одно и то же), которой пользуются в основном, когда использовать умляуты нет возможности (в международных адресах, билетах, визах и т.п., чтобы не смущать людей и программное обеспечение на той стороне) или нет желания (лень переключать раскладку, не нашёл умляут в айфоне), но «ae» встречается и как самостоятельное буквосочетание в немецком языке, не означающее и не читающееся как "ä" (Aerodynamik != Ärodynamik, Rafael != Rafäl).
Завтра какой-то редкий мировой язык с 20 тысячами носителей заявит, скажем, что у него «i» = «aex», и, внезапно, ".git" можно будет записать, как ".gaext" в этой локали.Да, в турецком ".gıt" = ".GIT" и ".GIT" != ".git".
mysql> SET collation_connection = latin1_german2_ci; Query OK, 0 rows affected (0.00 sec) mysql> SELECT 'Mäl' = 'mael'; +-----------------+ | 'Mäl' = 'mael' | +-----------------+ | 1 | +-----------------+
mysql> SELECT 'aerodynamik' = 'ärodynamik'; +-------------------------------+ | 'aerodynamik' = 'ärodynamik' | +-------------------------------+ | 1 | +-------------------------------+
Но как только в дело вступает пользователь, мы получаем опять проблемы и путаницу — для многих файлы «my work document.doc» и «My work document.doc» — это одно и то же, ровно как и bart simpson и Bart simpson — это одно и то же имя.
Но зачем сегодня иметь возможность различать файлы file.txt и File.txt
Нежелание использовать мозг всегда приводит к проблемамЭто не аргумент. Не всегда его нужно использовать. Человек не использует мозг, когда в этом нет необходимости. Есть такое выражение «Сделать на автомате». Вы же явно не используете мозг когда ходите, давно катаетесь на велосипеде или на горных лыжах и т. п.
Это не аргумент
Есть такое выражение «Сделать на автомате»
Что касается поиска
Обычно, человек понимает, что «вера», этот вероисповедание, а «Вера» — его грудастая соседка, «то» — союз, а «ТО» — какая-то аббревиатура, скорее всего техобслуживание. Так зачем усложнять человеку жизнь неестественным игнорированием регистра букв?
Мне продолжать?
Прежде чем вы начнёте уверять меня в стопроцентной грамотности всего населения планеты Земля, должен отметить, что у вас с десяток неправильных знаков пунктуации на пять предложений. Так, для статистики.
Для начала расскажите, какое отношение грамотность, заголовки и прочее имеют к файловой системе?
Это авторская пунктуация. Имею право.
И вот когда люди, которым свойственно не заморачиваться насчёт регистра букв, работают с файлами, важность регистра вгоняет их в ступор. Вы не забывайте, что файлы бывают не столько «QtSocketHandler.cpp», но и более приземлённые.Какая разница, какие у вас файлы? Важно как вы их открываете: выбором из списка или набором имени файла. Если вы их выбираете из списка, то вам, вообще говоря, всё равно — отличает ли файловая система «bart»а от «Bart»а или нет, а если вы вбиваете что-то руками, то это гиблый номер: вы никогда не добьётесь идеала. Почему «bart simpson.txt» и «Bart Simpson.txt» — это одно и то же, а вот «Барт Симпсон.doc» — что-то другое? Не надо даже пытаться имитировать женскую логику, честное слово, вы всё равно проиграете. Регистронезависимость файловых систем — это костыль из 70х, который помогал людям, когда компьютеры были большими, а байты в них — ещё больше и когда имя файла нельзя было выбрать из списка. Давно пора выкинуть эти костыли к бесам, но для этого придётся отказаться от Windows… ну всему своё время.
систем, разливающих регистр в имени файлов сейчас уже больше, чем систем, которые их не различают (Android, однако) и что?
А если считать среди систем с (удобной) клавиатурой и систем, за которыми работают (а не только кидают птиц и смотрят котят)?Давайте сразу рассмотрим системы с Windows, чего уж там.
Windows люди используют потому, что что под неё куча софта
Давайте сразу рассмотрим системы с Windows, чего уж там.
При вводе кода автодополнение обычно регистронезависимое даже в регистрозависимых языках.Это не так. Скажем, в IntelliJ Idea
fbq даст в автодополнении и fbq, и fizBazQuix, и FizBq. fBQ же дополнится (при тех вариантах в коде) только до fizBazQuix. И это — удобно.Вообще, тут скорее специальный синтаксис, о регистро(не)зависимости говорить не совсем корректно.
Кстати о клавиатуре и программистах. При вводе кода автодополнение обычно регистронезависимое даже в регистрозависимых языках. Удобно же.Вернулись туда же, откуда начали. В общем, либо крестик…
При вводе кода автодополнение обычно регистронезависимое даже в регистрозависимых языках. Удобно же.Часто можно настроить, если всё же не удобно.
Это, действительно, не аргумент. Это факт :)
Удобно, например, иметь файл «Smth» и папку «smth» с частями этого самого Smth.Удобно стрелять себе в ногу.
C:\\Windows//notepad.exe написать — винда поймёт.PIP
Вот, например, в рамках «case insensitive», «Й» и «И ̆» («и» с последющим символом крышки) — это одно и тоже или нет?Очевидно, что нет. Оно и выглядит не одинаково :)
А как только вы соглашаетесь на нормализацию символов в полный рост, то тут же во-первых подтягиваются всякие хинду и прочие, а во-вторых злые хаккеры начинают вам направление чтения текста менять и всячески «ехе» маскировать.Ну, маскировать файлы можно и без юникода — ФС в linux позволяют использовать все символы кроме слэша.
A big «thanks!» for bringing this issue to us goes to our friends in
the Mercurial land, namely, Matt Mackall and Augie Fackler.
Имхо — удобнее, когда одна из программ станет стандартом де-фактоWindows, например? :)

Уязвимость в Git: выполнение произвольных команд