й

За последние полгода интернет просто наводнила «буква» «и?». Я встречал ее на новостных сайтах, в мессенджерах, на хабрахабре и geektimes. «О чем вообще речь?» — спросите вы — «Я вижу обычную букву й!». Вам повезло. Я вижу ее так:
image
image
image
image
image
Если вы из тех счастливчиков, у кого буква «и?» выглядит так же, как и «настоящая» «й», вот вам фокус: скопируйте ее (букву «и?») в блокнот, поставьте курсор в конец буквы и нажмите backspace. Магия, отвал башки просто!
Как же так получается?

Графемы, глифы, code points, компоновка и байты

Очень краткое введение:
Графема — то, что мы привыкли называть буквой в смысле единицы текста. Глиф является единицей графики, и может графически представлять саму графему или же ее часть (например, различные диакритические знаки: ударения, умляуты, надстрочное двоеточие у буквы ё и т.д.).
Code Point — то, как записывается текст в представлении Unicode. Одна графема может записываться разными code points.
Code Points кодируются различным байтовым представлением в зависимости от стандарта: UTF-8, UTF-16, UTF-32, BE, LE…
Языки программирования, как правило, работают с code points; для нас, людей, привычно мыслить глифами.

Давайте же наконец разберемся с нашей буквой и?. Что же в ней такого особенного?
Эта буква представляет из себя одну графему («и» краткое), но записана она двумя code points:
U+000438 CYRILLIC SMALL LETTER I
U+000306 COMBINING BREVE

Если вы проделали фокус с нажатием backspace, вы как раз и стерли COMBINING BREVE, или, говоря полиграфическим языком, значок краткости над гласной.

Обычная буква «и» краткое, которую мы все с вами привыкли набирать клавиатурой, представляет из себя композитный символ, который записывается одним code point:
U+000439 CYRILLIC SMALL LETTER SHORT I

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

Чем это плохо?

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

За примером далеко ходить не нужно: относительно свежая статья с обзором мыши на geektimes, скриншот из которой приведен выше в статье. Давайте выполним поиск в Google по следующей фразе, которая, вроде как, есть в статье:
никто не мешает создать «пустой» профиль

image

Пост выдается вторым результатом, и, как видно по выделенной жирным части, у нас полное текстовое совпадение. Отлично, открываем его и пытаемся найти на странице этот же текст и видим, что Firefox ничего не нашел:
image

Поиск по Geektimes также не выдает подходящего результата:
image

Но стоит заменить композитную «й» на ее декомпозитного собрата «и?», как все встает на свои места:
image

Очевидно, что Google как-то преобразовывает запрос поиска, позволяя искать по глифам, а не по их code points.
Как это работает?

Нормализация

Стандарт нормализации Unicode описывает две эквиваленции символов: Canonical и Compatibility. Первая как раз позволяет сравнивать одинаковые глифы с разными code points, а вторая позволяет их сравнивать с упрощенными аналогами — ? с 1/2, ? c H и т.д.

Также существует 4 типа нормализации:
  • Normalization Form D (NFD) — canonical-декомпозиция. Разложит czesc (привет по-польски) на с, z, e, c + ?, s + ?.
  • Normalization Form C (NFC) — соберет то, что разложил предыдущий вариант.
  • Normalization Form KD (NFKD) — compatibility-декомпозиция. Сделает 1/2 из ?, 25 из 2?.
  • Normalization Form KC (NFKC) — попытается собрать то, что разложила предыдущая.

Если говорить о сайте типа хабрахабра, то имеет смысл производить NFC-нормализацию всех постов до их публикации, а поисковой запрос подвергать NFKD-обработке.

В Python, например, это можно сделать модулем unicodedata.
Скрытый текст
import sys
import unicodedata
print(unicodedata.normalize('NFKD', sys.argv[1]))

% python unicode.py czesc | hexdump -C
00000000 63 7a 65 73 cc 81 63 cc 81 0a |czes..c...|
% echo 'czesc' | hexdump -C
00000000 63 7a 65 c5 9b c4 87 0a |cze.....|

Заключение

Не могу сказать с полной уверенностью, кто виноват в появлении «и?» в рунете, но подозрение падает на Google Docs. К счастью, похоже, баг починили, т.к. уже 3 недели мне не приходилось смотреть на уползшую кратку.

Проблемы с глифами случаются и в оффлайне. Вот фотография реального паспорта с буквой, вероятно, «е?» (CYRILLIC SMALL LETTER IE + COMBINING DIAERESIS)

image

Комментарии (115)


  1. NeoCode
    15.07.2015 20:49
    +3

    Unicode все больше напоминает какую-то немыслимое нагромождение вещей, относящихся по сути к разным уровням абстракции.
    Хотя всего-то — таблица символов. Должна быть таблица символов — если делать по уму.
    Зачем вообще было делать возможность прикручивать всякие надстрочные символы к любой букве? Тогда бы уж и математическую нотацию поддержали, всякие верхние/нижние индексы, подчеркивания/надчеркивания/перечеркивания/обводку, многоэтажные дроби и корни и прочее.
    Только тогда это был бы уже не Unicode, а полноценный язык разметки. А это совсем не то, ради чего создавался Unicode. ИМХО конечно.


    1. SerafimArts
      15.07.2015 20:59
      +27

      Зачем вообще было делать возможность прикручивать всякие надстрочные символы к любой букве?

      Как обозначить символ ударения в строке? Сдублировать все возможные символы с этим символом? Думаю что не сто?ит.


      1. NeoCode
        15.07.2015 21:41

        А как обозначить верхний индекс (x в степени n)? Дублировать все цифры и буквы всех алфавитов еще два раза (для верхнего и нижнего индексов)?
        Чем ударение концептуально отличается от индекса?


        1. ValdikSS Автор
          15.07.2015 21:42
          +5

          Цифры-то есть: x?, x?, x?…


          1. NeoCode
            15.07.2015 21:56
            +1

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


            1. khim
              15.07.2015 23:47
              +3

              Латинский алфивит у Unicode есть почти весь (нет почему-то только буквы q): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.

              Что включать, а что нет — над этим очень долго думают, да. Понятно что всё это — некоторый компромисс, но как бы понятно, что как минимум IPA поддерживать нужно — оттуда всё и идёт.


              1. ivan386
                16.07.2015 12:04

                У меня на планшете отображаются только: h j n w. Остальные заменены пробелами.


              1. il--ya
                29.07.2015 22:37

                Я подозреваю, q отсутствует по вине Bell Labs.
                Вот так выглядели их кнопочные номеронабиратели:
                seriss.com/people/erco/dtmf_bell_labs/sv11111219.jpg


            1. torbasow
              16.07.2015 14:45
              +4

              Частицы бы, ли, же пишутся через пробел! Как можно так косячить в такой перфекционистской дискуссии?


      1. vanxant
        15.07.2015 22:15

        И сколько этих «всех возможных» символов могут иметь ударение? 6 гласных в латинице, 10 в кириллице, еще несколько (не знаю точное количество) в греческом. Умножаем на два для прописных букв. Итого аж меньше 50. При овер миллионе кодопоинтов в текущей версии стандарта.
        Как надо было делать правильно: для каждого языка свой набор символов, даже если внешне они совпадают. То есть кодопоинт немецкой А должен отличаться от английской А (так же как он сейчас отличается от кодопоинта русской А). Тогда для каждого конкретного языка можно однозначно было бы определить коллацию (алфавитный порядок и таблицу подстановок при поиске и сравнении). В которой, например, русские символы и, И, й, Й все приводились бы к И для целей сравнения, как это и должно быть по правилам конкретно русского языка. При этом для украинского языка коллация была бы другой. Потому что она и есть другая. Если бы кодопоинт русской И отличался от кодопоинта украинской И, всё работало бы «из коробки». Но сейчас программисты должны явно указывать, какую коллацию нужно использовать — вот только 99% слыхом про все эти заморочки не слыхивали.


        1. andreishe
          15.07.2015 22:58
          +15

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


          1. khim
            16.07.2015 00:17
            +2

            Хочу только добавить, что идея разделить кириллические и латинские символы пришла в голову разработчикам тоже не сразу. На какой-нибудь БЭСМ-6 они были слиты «де юре», на ЕС ЭВМ они были слиты «де факто», но уже на СМках их разнесли. То есть это просто оказалось удобнее. Французы же и немцы ничего такого даже не пытались сделать, то есть им этого было не нужно.

            Всё это случилось задолго до появления Unicode 1.0.


            1. vanxant
              16.07.2015 00:38
              +1

              На эту тему есть интересная заметка в преамбуле стандарта юникода.
              Хотя общеизвестно, что европейские алфавиты унаследованы друг от друга (греческий породил два потомка — латиницу и кириллицу) и многие буквы в них совпадают, тем не менее, в лингвистике принято считать их разными алфавитами. В том числе из-за сложившихся культурных отличий в начертании некоторых «совпадающих» букв (например, ? — a — а. Обратите внимание на разницу в начертании латинской и кириллической «a» в одном и том же шрифте).
              А вот на востоке всё наоборот, совпадающие иероглифы не дублируются для разных языков.


              1. khim
                16.07.2015 00:59
                +2

                А вот на востоке всё наоборот, совпадающие иероглифы не дублируются для разных языков.
                Там всё хуже. Изначально там попытались объединить якобы одинаковые иероглифы, чтобы вписаться в 65536 символов. Что в результате привело к страшной путанице, которую «разрулили» через одно место. А уж что они сделали с флагами — это вообще ни в сказке сказать, ни пером описать.

                P.S. Особенно радует что Unicode 8.0 в том месте, где должны описываться эти самые флаги ссылается на github. В раздел «Google Internationalization». А если завтра github обанкротится или Гугл перестанет этой темой интересоваться, то что — всё? Уже никто и никогда не сможет быть уверен, что он правильно реализует стандарт?


                1. macik_spb
                  21.07.2015 15:50

                  А что там с законодательным запрещением некоторых последовательностей символов?
                  Это я про emoji и вариации на тему компоновки: MAN+MAN+HEART и типа того…


          1. vanxant
            16.07.2015 00:25
            +1

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


          1. KReal
            16.07.2015 14:11

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


            ШОК! У немцев и так две раскладки :)


            1. MuLLtiQ
              16.07.2015 18:49
              +1

              ну так идея в том что имея немецкую раскладку можно писать символы английского алфавита, а вот с английской раскладкой символы немецкого — нет


        1. NeoCode
          15.07.2015 23:12
          +10

          В русском языке «И» и «Й» все-же разные буквы (как и буквы «Е» и «Ё»). То что у буквы есть какие-то элементы не связанные с ней непрерывными линиями, не значит что эти элементы нужно выделять в отдельные символы, и в дальнейшем лепить любой другой букве. Ударение — ладно, соглашусь, это отдельный символ. Может быть в каких-то специальных случаях нужен отдельный символ " ? ", но использовать его для конструирования существующих букв неверно.
          И, если возвращаться к исходной проблеме, ошибка в том что кто-то прилепил к букве «И» верхний элемент, получив таким образом визуально другую букву.
          Я могу аналогично сделать букву «Ы» из мягкого знака и латинской L: «Ьl». Но зачем?


          1. khim
            16.07.2015 00:03
            +4

            То что у буквы есть какие-то элементы не связанные с ней непрерывными линиями, не значит что эти элементы нужно выделять в отдельные символы, и в дальнейшем лепить любой другой букве.
            Конечно нет! Только вот беда: кратка (да, это русское слово) — это какой-то там элемент, а отдельная сущность. И может ставиться не только над «и», но и на «у» (в белорусском — получается "ў"), над «а» и «е» (в чувашском — получаются "?" и "?"), а в старославянских текстах могла употребляться ещё и над "?", «ю» и другими буквами. Наиболее распространённые комбинации имеют отдельные юникодные символы, но на всякие «А?» и " А?" букв не напасёшься.

            Я могу аналогично сделать букву «Ы» из мягкого знака и латинской L: «Ьl». Но зачем?
            Именно: незачем. Потому что знак «ы» логически на две сущности не разделяется. А вот «и» краткое (вы хоть на название-то обратите внимание, да?) — разделяется.


            1. NeoCode
              16.07.2015 00:20
              +1

              А вот «и» краткое (вы хоть на название-то обратите внимание, да?) — разделяется.

              «И» и Й" это две разные буквы. Название буквы тут вообще не при чем.
              Надстрочные элементы как таковые могут быть отдельными сущностями и использоваться в каких-то особых случаях (то же ударение или еще что-то) — но это не делает букву «Й» состоящей из двух символов. Иначе эта «кратка» занимала бы отдельное место в алфавите, чего не наблюдается.


              1. khim
                16.07.2015 00:32
                +4

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

                Надстрочные элементы как таковые могут быть отдельными сущностями и использоваться в каких-то особых случаях (то же ударение или еще что-то) — но это не делает букву «Й» состоящей из двух символов.
                Разумеется. Её делает состоящей из двух элементов тот простой факт, что в 35-буквенном русском алфавите её нет. А использовался он вовсе не так и давно — меньше ста лет назад.

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


                1. Egor3f
                  16.07.2015 01:37
                  +4

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

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


                  1. khim
                    16.07.2015 07:47
                    +2

                    По вашему же, получается, в Unicode должна отсутствовать полноценная буква современного алфавита только потому, что она образована модификатором.
                    А вот этого я не говорил. Более того, совершенно очевидно, что там отдельная буква «й» обязана присутствовать — хотя, возможно, как compatibility character. Просто потому что всякие странные кодировки типа ДКОИ-8 её содержат. А вот нужно ли считать канонической записью «и?» или «й» — это уже большой вопрос. Как уже было замечено MacOS скорее склоняется в первому варианту, Windows — ко второму, и у тех и у других есть доводы «за» и «против».

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


                  1. Zava
                    16.07.2015 12:28
                    +3

                    «Й» достойна быть самостоятельным элементом Unicode уже хотя бы по тому, что это не просто «И» краткая (которой гораздо ближе символ «i»), а по природе своей отдельный звук имеющий совершенно иную природу произношения: «и» — гласный звук, «й» — согласный. «И» и «Й» не чередуются в корнях слов, в отличае от «е» и «ё», которые в этом смысле — суть одно и тоже.


                1. andyudol
                  16.07.2015 02:25

                  Её делает состоящей из двух элементов тот простой факт, что в 35-буквенном русском алфавите её нет. А использовался он вовсе не так и давно — меньше ста лет назад.

                  Буква й пришла в русское светское письмо из церковнославянского грубо говоря при Никоне. А исчезла по повелению Петра I, отменившего все надстрочные знаки. Через небольшое время кратка восстановилась, но й отдельной буквой не считалась. И только большевики объявили её снова отдельной буквой.


            1. Iceg
              16.07.2015 10:53

              >А вот «и» краткое (вы хоть на название-то обратите внимание, да?) — разделяется.
              Тогда почему в алфавите она присутствует как самостоятельная буква? В немецком гласные с умляутом — это именно обычные гласные с умляутом, их нет в алфавите.


              1. surkova
                16.07.2015 14:23
                +2

                В шведском a, a, o — обычные буквы алфавита. И шведский алфавит это не A-Z, а A-O.


              1. gene4000
                17.07.2015 11:28

                Зато есть «эсцет», которую тоже упразднить давно хотят.


          1. vanxant
            16.07.2015 00:28
            -7

            Буквы И и Й разные, но по факту взаимозаменяемые. Любителями андройда, например. Хотя это и безграмотно, но в южных губерниях общепринято.
            А вот точки над Ё даже по правилам ставятся только в том случае, если их наличие/отсутствие влияет на смысл. В случае все/всё, например, или в именах собственных.


            1. khim
              16.07.2015 00:48

              Дело даже не в любителях «андройдов». Как я уже писал: дело в том, что ещё каких-то 100 лет назад буквы «й» не существовало, а знак " ?" можно было ставить не только над «и». А поскольку Unicode должен позволять набирать не только современные тексты и будет странно если он будет совместим с древнешумерскими текстам, но не будет поддерживать старославянские, то и имеем то, что имеем — всякие чудеса типа ??…


            1. Maccimo
              16.07.2015 02:46
              +4

              Малограмотные граждане без проблем заменяют на «и краткую» и безударное «е».
              Взаимозаменяемыми от этого «и», «й» и «е» не становятся.


              1. vanxant
                16.07.2015 03:59
                -7

                Да плевать, много или мало в этом грамоты.
                Гуманитарии они вообще люди такие, оторванные от реальности.
                Вот допустим, у вас интернет-магазин телефонов.
                И вот вы анализируете логи поиска и выясняете, что 3% посетителей ищут [нокия андройд]. И дальше вы можете или искать по правилам юникода, или по правилам сложившейся практики.
                Ну, если вы владелец магазина, вы, конечно, можете удовлетвориться осознанием собственного грамматического превосходства над этими убогими.
                Но если вы всего-лишь разработчик, то, с точки зрения владельца, вы допустили баг, который снизил его доходы с поиска по сайту на 3%. И он имеет полное право вычесть убытки из вашей зарплаты.
                Шутки шутками, но битрикс, который требует mbstring.func_overload=2 на этапе установки, многократно окупается уже за счёт этого — относительно джумлы и ворпресса, где в плагинах сплошь и рядом тупорылые вызовы однобайтовых строковых функций.


                1. andreishe
                  16.07.2015 05:24
                  +9

                  И он имеет полное право вычесть убытки из вашей зарплаты.

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


                  1. vanxant
                    16.07.2015 06:09
                    -5

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


                    1. khim
                      16.07.2015 07:03
                      +7

                      Согласитесь, что «лишать премии за умеренно-некачественное исполнение служебных обязанностей» и «и он имеет полное право вычесть убытки из вашей зарплаты» это таки сасем чут-чут разные вещи, да?

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

                      Я, правда, сам это больше десяти лет назад наблюдал (просто прекратив общаться с российскими работодателями), но мои знакомые говорят, что за эти десять лет ничего толком не изменилось…


            1. lany
              16.07.2015 07:54
              +10

              Взаимозаменяемые? А в каких губерниях говорят «йрйдйи» вместо «иридий»?


        1. khim
          15.07.2015 23:49
          +1

          И сколько этих «всех возможных» символов могут иметь ударение?
          100500, как бы. Лингвистика — интересная наука, но для того, чтобы возможность как-то записывать слова языков, не имеющих письменности требуется изрядно ухищряться.


        1. asm0dey
          16.07.2015 06:55
          +1

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


      1. chabapok
        16.07.2015 10:02

        Насколько помню, в юникоде есть как буквы с ударением одним codepoint, так и дополнительный codepoint ударения.


        1. Maccimo
          16.07.2015 14:22

          А вы уверены, что это именно буквы с ударением, а не, к примеру, часть венгерского алфавита?
          https://ru.wikipedia.org/wiki/Венгерский_алфавит


          1. chabapok
            16.07.2015 15:38

            не уверен


  1. fshp
    15.07.2015 21:39

    А каким браузером и шрифтом вы пользуетесь?


    1. ValdikSS Автор
      15.07.2015 21:41

      Firefox, Liberation Sans. Такая же проблема под Windows 7 с IE 11 на Meduza, например (у них там PFRegalTextPro-RegularB).
      meduza.io/news/2015/06/11/v-gosdumu-vnesen-zakonoproekt-ob-ispolnenii-gimna-rossii-v-shkolah


      1. fshp
        15.07.2015 21:54

        FIrefox 39, Liberation Sans. Проблемы нет.


      1. encyclopedist
        15.07.2015 21:57
        +5

        Забавно, у меня Firefox (на Ubuntu 15.04) показывает сам топик в DjVu Sans, и там все нормально. В комментариях почему-то Liberation Sans. В заголовке окна и вкладки шрифт Ubuntu, и там «кратка» съехала.


  1. NeoCode
    15.07.2015 21:40

    del


  1. kalterfive
    15.07.2015 21:50
    -4

    Буква «й», которую я ввожу с клавиатуры, и котороую просите скопировать вы — разные. Определено экспериментально и при помощи шрифта.


    1. encyclopedist
      15.07.2015 22:00
      +5

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


  1. Mithgol
    15.07.2015 22:18
    +6

    Я всегда думал, может быть наивно, что «и с краткою» вместо однобуквенного «й» вставляет какой-то макосный софт.

    Потому что я видел этот символ часто во блогозаписях одного блоггера, о котором достоверно известно, что человек этот — пользователь «Эппл».

    Неужели тут всё же не «Эппл», а «Гугл» повинен?


    1. ValdikSS Автор
      15.07.2015 22:31
      +2

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


    1. Imp5
      15.07.2015 22:35

      А можно ссылку?


    1. Maccimo
      16.07.2015 00:10
      +4

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


      1. stychos
        16.07.2015 01:19
        +8

        От виндоводов получал архивы вообще с кошмаром вместо названий )-:


      1. quarantino
        16.07.2015 05:21
        +2

        На маке файловая система (HFS+) использует decomposed unicode, на форточках (например NTFS) — composed. (А на линуксе — как повезет, можно получить обе сразу).

        Иногда получаются проблемы — архивы, синхронизация файлов, вот это все. В svn с этим долго боролись в свое время.


        1. khim
          16.07.2015 07:10
          +2

          А на линуксе — как повезет, можно получить обе сразу
          На линуксе самый простой и «естественный» подход к именованию файлов. Имя файла — это любая последовательность байт в которой нет символов '/' и '\0'. Что здорово упрощает ядро, но приводит к куче проблем в других местах.


    1. stychos
      16.07.2015 01:18
      +2

      Если в этой фразе всё в порядке, то (современная) макось тут не при чём.


  1. GEOgraf
    15.07.2015 23:00
    +2

    >вот вам фокус: скопируйте ее (букву «и?») в блокнот, поставьте курсор в конец буквы и нажмите backspace. Магия, отвал башки просто!
    У меня ubuntu, а что не так, объясните? заинтриговали…


    1. ValdikSS Автор
      15.07.2015 23:02

      Не работает, башка (знак краткости) не убирается, буква не превращается в обычное «и»? Что за браузер? Может, особенность IME? В убунту какой, ibus?


      1. encyclopedist
        15.07.2015 23:15
        +3

        Я тоже попробовал, gedit, Ubuntu 15.04. Буква удаляется полностью. ibus выключен.


        1. zelenin
          15.07.2015 23:24
          +2

          а уж как PHPStorm колбасит от комбинирующих символов — мама дорогая.


          1. dMetrius
            16.07.2015 09:43

            Да, PHPStorm'у очень плохо от этой и?


          1. artspb
            21.07.2015 17:17

            А поделитесь скриншотом, пожалуйста — любопытно.


            1. zelenin
              21.07.2015 21:37

              i.imgur.com/NjDgFsk.png это просто строка с разными символами для теста ) местоположение курсора отмечено стрелкой. При перемещении курсора символы прыгают в разные стороны. Заметьте где закрывающая кавычка и точка с запятой — между ними на самом деле нет пробелов — это артефакты.


      1. GEOgraf
        15.07.2015 23:23
        +1

        Я вас не понял
        > Не работает, башка (знак краткости) не убирается, буква не превращается в обычное «и»?
        я просто попробовал в gedit, и всё норм.
        >Что за браузер? Может, особенность IME? В убунту какой, ibus?
        мне интересно как это в windows происходит на примере блокнота и не понимаю причём здесь браузер.


        1. ValdikSS Автор
          15.07.2015 23:29
          +1

          А, я думал, вы в браузере в поле «ответ» копируете. У меня KDE4, выглядит это так:
          a.1339.cf/mbyzyb.webm


          1. GEOgraf
            15.07.2015 23:30

            прикольно))) у меня тоже… браузер мазила.


          1. GEOgraf
            15.07.2015 23:49

            кстати, delete по другому работает — удаляет символ полностью


          1. vanxant
            16.07.2015 00:40

            в фф/вин7 аналогично, й превращается в и


      1. turbo_exe
        15.07.2015 23:28

        mac os x yosemite. не работает.


        1. werktone
          15.07.2015 23:37
          +3

          От «блокнота» зависит. В nano работает, например.


          1. Mikage
            15.07.2015 23:59

            Кажется тут еще зависит от чего-то… Вставил ту самую «и?»


    1. chabapok
      16.07.2015 10:04

      тогда используйте gedit


      1. GEOgraf
        16.07.2015 11:02

        в gedit всё корректно, поэтому и задал вопрос.


        1. chabapok
          16.07.2015 12:50

          Значит это зависит не от редактора а от движка.
          у меня в gedit оно вывелось как 2 символа рядом, но курсор за черточку от буквы й поставить не давало — т.е. сам gedit видел это как 1 символ.


  1. AndreyDmitriev
    15.07.2015 23:04
    +3

    уже 3 недели мне не приходилось смотреть на уползший умляут

    Вот честно — ни разу такого явления не видел.
    Вообще если быть дотошным, то эта галочка над й — не умляут, а «кратка» или «бреве» — так по крайней мере википедия утверждает.
    А умляуты — они в основном только в немецком встречаются.

    Кстати, об умляутах — я уже много лет время от времени вообще смотрю вот на такое:



    И еще долго буду смотреть, потому что многим просто не приходит в голову, что кто-то может в Германии включить кириллицу для неюникодных приложений (да, я в курсе про applocale). Хотя казалось бы — юникод уже почти четверть века существует.
    Я настолько привык к этим «цffnen» и «schlieЯen», что даже и не замечаю уже — как будто так и надо. А у вас — «галочка уползла», понимаешь…


    1. ValdikSS Автор
      15.07.2015 23:21
      +4

      Вообще если быть дотошным, то эта галочка над й — не умляут, а «кратка» или «бреве» — так по крайней мере википедия утверждает.
      Спасибо, исправил.

      Эх, я как-то с японской локалью сидел, тоже насмотрелся на C:?Program Files?


      1. SgtRiggs91
        16.07.2015 00:04
        +1

        Есть такой софт на Java для регистрации пассажиров в аэропортах, пишется для одной большой российской авиакомпании. Так вот в консоли там знак йены заменяет апостроф. Вот прямо нажимаешь на клавиатуре ', а вставляется ?. Это не единственная такая замена там, но эта встречается чаще всего.


        1. ValdikSS Автор
          16.07.2015 00:05
          +4

          Так там локаль, наверное, японская с SHIFT JIS установлена, только у нее такая особенность
          ru.wikipedia.org/wiki/Shift_JIS


  1. zelenin
    15.07.2015 23:04
    +1

    подобная статья уже была на Хабре. В ней было рассказано все то же самое, примеры с браузерами приводились, причем даже тесты в разных.

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


    1. ValdikSS Автор
      15.07.2015 23:07

      Хм, если найдете, линканите, пожалуйста. Я не нашел, когда искал.


      1. zelenin
        15.07.2015 23:19
        +2

        news.shamcode.ru/blog/sanitize-this-i-search-that автор удален, поэтому статья исчезла — в избранном кусочек текста нашел и загуглил
        вот еще подробная статья на эту тематику: habrahabr.ru/post/45489


        1. ValdikSS Автор
          15.07.2015 23:42
          +2

          Спасибо, хорошая статья и информативные комментарии. Обидно, что автора удалили.


          1. matiouchkine
            16.07.2015 10:23
            +3

            Автор я; удалить меня не так просто, но с тех пор все такие статьи пишутся исключительно на английском и выкладываются в места, где нет воинствующей русскоязычной школоты.

            По мотивам этой заметки я тогда написал и более-менее полновесную библиотеку для руби, которая умеет композицию и декомпозицию, up-case и down-case, и так далее. Работает с современной версией описаний юникода от консорциума. Если надо — пожалуйста: github.com/mudasobwa/forkforge


  1. Ezhyg
    15.07.2015 23:33

    Когда я написал комментарий про косяк с «отображением» этой буквы, где-то тут же, меня просто проигнорировали. Мне встречалось такое поведение только на хабре/гике.


  1. FishDude
    15.07.2015 23:54
    +2

    Как пишут любители повыпендриваться: «ьi»


    1. newdya
      16.07.2015 03:47
      +7

      Так пишут люди с украинской раскладкой, скорее.


  1. domix32
    16.07.2015 01:04
    +17

    А????????????????????????? ????????????????????????????е???????????????????щ????????????????????????????????ё?????????????????????????????? ???????????????????????????????м???????????????????о????????????????????ж??????????????????????н??????????????????о?????????????????????????????? ????????????????????????в????????????????????с???????????????????????????п????????????????????????????????????о?????????????????????????м??????????????????????????????????????н????????????????????????????и??????????????????????????????????т??????????????????????ь????????????????????????????????? ??????????????????????????????Z????????????????????????????A??????????????????????????????L?????????????????????????????G??????????????????????O????????????????????????


    1. grossws
      16.07.2015 05:10
      +1

      Вы очень

      суровы


      1. Ubuntovod
        16.07.2015 06:52

        На какой системе смотрите, интересно?

        Артефактов нет
        image


        1. grossws
          16.07.2015 07:07
          +2

          Arch Linux, KDE, chrome 43. В консоли хрома другие артефакты (например, нет черточек вокруг А). То что отрендерилось содержит 32 разлоичных глифа из Arial, 11 из DejaVu Sans и 11 из Liberation Mono. В общем, поддержка такого юникода у меня в шрифтах — так себе.


        1. asm0dey
          16.07.2015 07:19
          +1

          Ubuntu 15.04, yandex browsr.


        1. shoorick
          16.07.2015 11:00
          +1

          Ubuntu 12.04, Gnome, Google Chrome 43 — вижу квадратики вместо некоторых диакритических знаков.


          1. unwrecker
            16.07.2015 12:52
            +1

            Ubuntu 14.10, во всём кроме Firefox такая же фигня с квадратиками. В Firefox всё отлично.


        1. GAS_85
          16.07.2015 16:06
          +1

          Win 7, FireFox


          1. il--ya
            22.07.2015 18:22

            Интересный эффект, если выделить


        1. ZyXI
          16.07.2015 17:42
          +2

          Судя по количеству символов, которое я вижу:

          Скрытый текст
          Много символов по вертикали, наезжающих на заголовки этого и следующего комментария


          1. ZyXI
            16.07.2015 17:45

            Почему?то хабр зарезал все спойлеры, кроме первых трёх:

            Скрытый текст
            Firefox:
            Много символов по вертикали, наезжающих на заголовки этого и следующего комментария
            Chromium:
            Много символов по вертикали, наезжающих на заголовки этого и следующего комментария
            Старая Opera:
            Много символов по вертикали, наезжающих на заголовки этого и следующего комментария
            Qupzilla:

            Lynx:

            Links, консоль:

            Links, GUI:

            ЕLinks:


            1. ZyXI
              16.07.2015 18:18
              +2

              Теперь зарезал все картинки, кроме первых трёх. Всё на одном изображении:

              171K


  1. newdya
    16.07.2015 03:37
    +7

    >смотреть на уползшую кратка.
    Слово-то склоняется. «Кратку»!


    1. ValdikSS Автор
      16.07.2015 08:41
      +9

      Блин, ну как так. То «и» краткое, когда я всю жизнь думал, что «и» — она, буква, значит краткая, то еще и кратка склоняется.


  1. pepelsbey
    16.07.2015 03:55
    +3

    Первый раз столкнулся с уехавшей краткой именно на Маке, так что привычно виню скорее его, чем Google Docs.


  1. BlackFoks
    16.07.2015 09:55

    Раньше этим еще грешил Adobe Acrobat. Например при копировании из него в Word, «й» вставлялась как 2 отдельных символа, причем Word тогда некорректно это обрабатывал и знак «кратка» съезжал. Приходилось постоянно за этим следить, особенно во всяких курсовых и прочем, где могли придраться.


  1. toxicdream
    16.07.2015 12:14
    +1

    Если кратка уползает, то это по большей части вина определенного шрифта.
    Попробуйте в том же блокноте с текстом с этой «и?» «поиграться шрифтами».
    Много интересного можно увидеть.


  1. AndersonDunai
    16.07.2015 14:42
    +1

    Йопт!


  1. ValdikSS Автор
    16.07.2015 22:37
    +1

    Внимание!!! Найдена «е?» (CYRILLIC SMALL LETTER IE + COMBINING DIAERESIS) в большом количестве!
    habrahabr.ru/company/yandex/blog/250753

    Написал автору публикации, может сможет вспомнить, какая ОС и софт использовался.


    1. encyclopedist
      16.07.2015 23:32

      Я тут всрпомнил, что когда-то обращал внимание на «красивенькие» кавычки в каком-то топике. И нашёл, и бинго! Буква й там составная! Человек использовал некий iA Writer. Кстати, в топике по вашей ссылке тоже такие кавычки есть.


      1. encyclopedist
        16.07.2015 23:42

        Видимо, вот это: iA Writer. Есть для MacOS, iOS и Android. Интересно, зараза свойственна конретному редактору или это свойство какой-то библиотеки которую они применяют и есть другие приложения с такими же свойствами.


        1. encyclopedist
          16.07.2015 23:57

          На их сайте в справке интересная информация тут. Похоже, эти замены делает таки OSX.


      1. ValdikSS Автор
        17.07.2015 00:36

        Хм, там нет составных й.


        1. encyclopedist
          17.07.2015 00:39

          Хм, похоже я действительно ошибся.


  1. Artima
    17.07.2015 11:37

    Мда… недавно боролся с неразрывным пробелом в тексте отчаянно, а тут оказывается еще интереснее всё.


  1. MTonly
    19.07.2015 02:19
    +1

    Проблема в полный рост в статье на Lenta.ru (проявляется в Firefox 40 и IE 11). В браузерах на основе Chromium (например, Opera 30 и Яндекс.Браузер) не проявляется, и поиск по странице работает корректно.


    1. vlivyur
      20.07.2015 08:19

      Причём лишь некоторыми местами, основная масса букв нормальные. В opera 12 тоже не работает.


  1. amarao
    24.07.2015 19:53

    Линукс, FF, mousepad — все композитные символы рисуются нормально и удаляются за единый бэкспейс.