Как стать автором
Обновить

Комментарии 40

НЛО прилетело и опубликовало эту надпись здесь
Еще одно хорошее дополнение.
Дизайн Unicode по большому счету содержит множество ошибок. Из за желания угодить всем нагородили вот это всё, и это при том что Unicode создавался во времена «однополярного мира», когда США и американские корпорации, будучи практически монополистами в сфере IT-стандартов и технологий, вполне могли продавить более простую концепцию.

Зачем например в Unicode «направление письма»? Unicode это просто набор символов. Как их вводить, выводить и интерпретировать — дело софта. Вот в Китае и Японии направление письма вообще «сверху вниз», но ведь Unicode такое не поддерживает? И кстати, китайцы и японцы с появлением компьютеров вполне адаптировались к направлению «слева направо», может и арабы бы также адаптировались?

Далее, регистр символов — это особенность исключительно европейских языков, унаследованная из ASCII (который создавался в условиях гораздо более жесткой экономии оперативной памяти). Понятно что старались сделать обратную совместимость, но по большому счету регистр должен был стать «декорацией» (как bold, italic, subscript или superscript), а не отдельными кодовыми точками. Символы 'a' и 'a' (курсивом) — как-бы один символ, хотя они совершенно отличаются визуально. Символы 'a' и 'A' при этом — разные. Логика?

Из-за той же обратной совместимости осталась незадействованной большая часть символов в самом начале кодовой таблицы, с 0x00 до 0x1F. А между тем их стоило бы задействовать для наиболее употребительных спецсимволов (таких например как стрелки, дополнительные знаки пунктуации, некоторые математические символы и т.п.). Размещение этих символов в однобайтовой части важно, так как именно однобайтовая часть Unicode по очевидным причинам нанесена на все клавиатуры мира. Оставить в этой области можно было бы только нулевой код и код новой строки, и заодно провести редизайн концепции переноса строки, т.к. в основных системах (Win, Mac, Linux) перенос строки устроен по-разному (0x0D, 0x0A или оба сразу).

Ну и наверное можно еще накопать таких вот нелогичностей.

Как тогда поступить с ß в немецком, например?

Не знаком с немецким, но почитал — занимательно, получается что это как раз тот случай, когда Unicode повлиял на язык (введение заглавной буквы в Unicode раньше чем она появилась в языке).
Unicode — это прежде всего набор символов и соответствующих им кодов. Как их использовать — дело софта. И наверное, если разные модификации (декорации) одного смыслового символа значительно отличаются и не могут быть сгенерированы программно (как в случае underline, subscript, superscript — просто подчеркиванием или уменьшением размеров), то нужно эти символы вводить отдельно…

Одинаковые символы с разными кодами (как например латинское 'A' и русское 'А') введены просто для удобства группировки, чтобы символы одного языка не были разбросаны по всему диапазону. Для европейских языков большая часть символов общая, и лишь некоторые (2..4 штуки в каждом алфавите) свои собственные — поэтому не имеет смысла вводить отдельно коды для «немецких», «французских» и «итальянских» букв 'A', а проще сформировать единый общеевропейский метаалфавит, что и было сделано. В русском большая часть символов отличается, поэтому сделали отдельный набор.

В общем понятно, что Unicode несет на себе бремя обратной совместимости не только с ASCII, но и с историей письменности как таковой:) И идеального решения не найти. Может быть нужно было радикальное решение в виде разделения абстракций — отдельно слой сопоставления символов и «кодов символов» (в этом слое все буквы, выглядящие как 'A', будут иметь единый код), и отдельно слой сопоставления «кодов символов» и «смысловых кодов» (здесь уже разделение по алфавитам). В результате было бы две кодировки — графическая и семантическая. Понятно, что это кардинально повлияло бы на все ОС и на весь софт, и мы бы жили в совсем другом мире:)

В результате было бы две кодировки — графическая и семантическая.

Так они есть. Можно сделать букву "й" так, как она написана левее, а можно и так: "й". Вы не можете заметить это глазом (конечно, если ваш браузер правильно всё делает), но второй вариант состоит из двух глифов: "и" и закорючка над ней. Вот статья на хабре про это: https://habr.com/ru/post/262679/ . А теперь, собственно, сложная часть: вы не можете в общем случае сделать upper/lower case на такие составные глифы. Потому что, например, в турецком языке есть строчная буква ı, которая получается из заглавной I. А для английского языка lowercase(I) == i.

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

Всё же создатели unicode пользовались концепцией, что письменность уже есть, и для каждого народа его письменность ему дорога, и нужно создать систему, которая позволить описать все их символы в более-менее логичном и единообразном виде, предоставив ещё и механизмы для каких-то общих операций типа lowercase и uppercase, а так же нормализации. То есть идти от предметной области, а не пытаться насаждать что-то новое и неестественное для каждого конкретного языка.

Я не то чтобы предлагаю, я размышляю. Вот например, можно ли закорючку от буквы 'й' присоединить к иероглифу, цифре или знаку препинания? Что получится?
Если идти по пути универсальности, то почему бы и нет? А если закорючку присоединить к другой закорючке?

С одной стороны это конечно хорошо, что можно генерировать некоторые новые символы таким образом. А с другой… как-то бессистемно. Ну ввели бы тогда специальный код «escape» для специальных escape-последовательностей — и вот туда можно было бы добавить элементы форматирования. В том числе жирный/курсив/подчеркивание, капитель, верхний и нижний индекс, надстрочные и подстрочные символы (Ruby character), геометрические преобразования (поворот символа на 90/180/270 градусов или даже повороты с каким-то шагом типа 5°, отражение по горизонтали и вертикали), цвет символов (для всяких эмодзи вполне актуально, и сейчас это уже как-то делают) и т.п. Это было бы хотя-бы системно. Но тогда бы это была уже не таблица символов, а нечто большее. А сейчас оно застряло где-то на полпути…
НЛО прилетело и опубликовало эту надпись здесь
В русском разделе такой статьи нет, но странно, что в английской версии не упомянут один из самых удачных мемов, на мой взгляд. :-)

И получится хтмл.

Да ладно бы html, они и полноту по Тьюрингу могут сделать:)))

В результате было бы две кодировки — графическая и семантическая.

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

Очень смелое предположение приравнять заглавные буквы к стилю типа italic или bold. Тут же оказывается что такой стиль как "заглавная" можно применить далеко не ко всем символам. Сразу получается нестыковка. Несемметричность. А хотели сделать как лучше

Интересно, а italic разве можно безопасно применять к иероглифам? Это не может исказить их смысл?

таким образом получается что универсальный подход невозможен даже к стилям написания типа italic/bold не говоря уже про строчная/заглавная

Не говоря уже о том, что italic / bold – это просто оформление, а заглавная буква семантически отличается от строчной.

заглавная буква семантически отличается от строчной

Особенно в аббревиатурах. «Пишем оду ОДУ». ОДУ — обыкновенное дифференциальное уравнение

Символы 'a' и 'a' (курсивом) — как-бы один символ, хотя они совершенно отличаются визуально. Символы 'a' и 'A' при этом — разные. Логика?

Стиль символа - это всего лишь оформление. Оно только изредка может быть использовано для отображения выделения интонацией или других нюансов произношения. Чаще всего для книг это курсив, иногда жирный шрифт или разреженные буквы. Для компьютерной переписки чаще в качестве выделения используем КАПС. Если взять несколько текстов с полностью одинаковым содержанием, но 1й будет написан обычным шрифтом, 2й - весь исключительно курсивом, а 3й - полностью буквами красного цвета, то для читателя смысл всех текстов совершенно одинаков, хотя оформлены они по-разному.

Заглавные и строчные буквы - это различие другого рода. Например, следующие фразы отличаются только регистром всего одной буквы, но несут разный смысл. «Он позвонил жене» и «Он позвонил Жене»

В первом случае, очевидно, речь идёт о супруге. Во втором случае Женя - это имя, причём необязательно женское.

Он позвонил жене - это уже речь о любимой работе. В принципе, любое изменение стиля (в том числе и начертания) делается с каким-либо смыслом. И тут мы возвращаемся к тегам strong, abbr, irony..

Русский язык на уровне языка не имеет курсива, полужирного и т.д. А вот заглавные буквы имеет.

Он позвонил жене - это уже речь о любимой работе. 

Ну вот я носитель языка, я вас совершенно не понял, даже с вашим пояснением. А вот жене/Жене – вполне очевидно и однозначно.

Это русская пунктуация, по очевидным причинам, не имеет. А вот русская типографика очень даже имеет.

Находясь в контексте даже вы бы всё поняли. А без контекста и вашу "Жене" можно трактовать, не как имя, а как особо почтительное обращение к супруге. Так что для ясности надо ещё и ударение добавить.

В моем первом сообщении жирное начертание - просто для визуального выделения различий. Про «strong, abbr, irony» не понял, предложения «Он позвонил ...» содержали информацию только про факт звонка.

Находясь в контексте даже вы бы всё поняли.

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

А без контекста и вашу "Жене" можно трактовать, не как имя, а как особо почтительное обращение к супруге

Это по каким правилам русского языка? Правила по «вы» и «Вы» существуют и там в одном из случаев большая буква - как часть канцелярского протокола. Знаю про Человека с большой буквы, а с большой буквой для жены ничего не встречал.

Знаю про Человека с большой буквы

По тому же самому правилу.

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

Тогда не направление, а код локали нужно сохранять. Раз уж в разных локалях upper/lower case работают по разному — такую составную строку правильно обработать невозможно.
Зачем например в Unicode «направление письма»?

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


но по большому счету регистр должен был стать «декорацией»

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


Мне кажется главная беда UTF-8 не несуразности в кодировке, а люди. Как и в случае с временем, люди придумали избыточно сложные и часто нелогичные системы, да ещё и с таким разнообразием.

Символы 'a' и 'A' при этом — разные. Логика?

Правила правописания.
Хотя для детей, воспитанным твиттором, это может быть и не очевидно.

может и арабы бы также адаптировались?

Арабы может и да, мусульмане точно нет.
Раньше переписчикам Корана за первую ошибку отрубали руку, за вторую — голову.

В UTF-8 addslashes работает правильно

зато есть ВОМ, который днесь мне доставил развлечений…

Статья автора, который вдруг узнал, что за пределами английского языка тоже есть жизнь. Или это перевод 10-летней давности?

Представляю, как бы он удивлялся, если бы увидел селектор win-koi-dos на каждой странце сайта, или статьи "как настроить апач на 8001 порт - кодировка cp1251, а 8002 порт - cp866".

"uniq_name" UNIQUE CONSTRAINT, btree (name)

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

Вообще не понял данный посыл.

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

Можно создать фишинговую ссылку которая ведет не на хорошо известный сайт а на сайт с точно такими же глифами в адресе.

Можно, но это другой пример.

А пример, приведённый в статье в разделе SQL, имхо, не имеет никакого смысла.

Адрес на посылке, отправляемой почтой, вполне можно так подделать.

Старая добрая турецкая И/Ы может доставить очень много боли. И доставляет, в известной операционной системе, нечувствительной к регистру в именах файлов.

Если сохранять 뼧 в файл, то это EB BC A7, а не BF 27 - почему ?
Я могу предположить, что это изза utf8, но тогда и инъекций с этим символом не будет.

Поправьте где неправ.

Как я уже писал в UTF8 такие инъекции не работают

В UTF16 это действительно BF 27. Но это не значит что такая иьекция будет работать всегда и везде

А есть ли в utf8 символ в 2 или более байтов, содержащий 0x27 ?

нет

но даже в UTF16 я не понимаю почему может работать такая иньекция

Зарегистрируйтесь на Хабре , чтобы оставить комментарий