Диакритическая проблема

Недавно наткнулся на одну странную вещь. Вряд ли бы разобрался с ней, если бы раньше не встречал. С недавних времён Claw обновляется с помощью отличной утилиты rsync. Эта штука сама синхронизирует обе директории с файлами билда проекта с моего ноута на удалённый сервер. Но вот проблема. URL'ы некоторых файлов не могли правильно разрешиться. В частности так было со скриншотом для Counter. Его файл назывался "Counter - 110 посещений.png". Обычный такой файл. На сайте показывалась иконка битой ссылки на изображение. Думаю, вы могли видеть такие битые ссылки на Demoscene, они там часто появляются.

Safari Chrome Ваш браузер
Safari - Иконка пустого файла Goodle Chrome - Иконка пустого файла Claw - Изображение не найдено

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

Имя файла: Counter - 110 посещений.png
Его адрес: Counter%20-%20110%20%D0%BF%D0%BE%D1%81%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B8%CC%86.png

Как вы знаете, не ASCII символы в URL адресах принято кодировать. Если перевести такой закодированный адрес назад, то можно понять, в чём была ошибка. Она была в букве й. Итак, с этой ошибкой мне уже не раз пришлось столкнуться, особенно она меня коробила, когда работал с Aseprite.

Не знаю, как в других системах, но macOS при сохранении файла, проводит для его имени NFD. Все составные символы раскладываются как простые плюс диакритический символ. В нашем языке таких символов четыре, это буквы Йй и Ёё. Вместо того, чтобы записать в операционной системе файл с этими буквами напрямую, эти символы разбиваются на два и иногда ломают редакторы и ссылки.

Unicode U+0308  ̈ COMBINING DIAERESIS
Unicode U+0306  ̆ COMBINING BREVE

Можете скопировать эти диакритические символы и попробовать вставить их в текст различных редакторов. Разные программы реагируют по-своему, кто-то комбинирует символ с предыдущим, кто-то оставляет как есть. Кстати, комбинация множества этих символов в одной букве или на одном слове называется Zalgo text.

C̲̱̣ȃ̑̍t̑a̱̲ly͡st̬̥

Касательно клешни, проблема была именно в этом. Ubuntu и macOS по разному хранили имя файла. Чтобы починить ошибку, надо было поменять ссылку на ровную, либо добавить в имя файла диакритический символ в конец. Тогда в операционной системе файл бы заканчивался не на й, а на и<0306>. Ровно таким и было первое временное решение проблемы. Но оно совершенно идиотское, потому что придётся тогда каждый раз смотреть и править все эти буквы вручную. Поэтому все файлы вложений были изменены на новый формат. Теперь вместо красивых русских имён будут url safe строки. Всё маленькими буквами, на английском языке и с тремя минусами в качестве разделителя темы. А все сложные символы теперь заменены словами:

 Было: Counter - 110 посещений.png
Стало: counter---110-visits.png

 Было: 100% - Карта позднего уровня
Стало: 100percent---map-of-the-endgame-level

Да, красоту упустили, но зато поисковые машины и браузеры будут рады. Именно эта причина, как я понимаю, и является ключевым объяснением факта, что многие приложения любят делать идиотские транслитерированные имена файлов и конечных точек. Сколько раз вам встречалось что-нибудь в стиле "otchet-po-practike-8" или "tachku-na-prokachku" вместо правильных имён? Увы, транслитерировать слово куда легче и быстрее, чем переписать или перевести (если мы говорим об автоматизации) на английский язык.

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

Aserpite - Диакритическая проблема