Минимум, который каждый разработчик должен знать о Unicode

 Публичный пост

Никита @tonsky написал статью о Unicode: о его популярности и сложности.

Сначала Никита пишет, что такое Unicode сам по себе: какую проблему решает и как много символов в нем можно закодировать.

Затем говорится о UTF-8: почему латинская "b" может занять байт, кириллическая "й" — два, а "🧑‍💻" вообще будет одинадцать байтов.

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

Если вы программист, вы узнаете:

  • почему len(text) или text.length выдают неожиданный результат,
  • как делать правильно
  • и почему сингулярности не будет.

Текст читается за 25 минут.


Ссылки по теме:

2 комментария 👇
Egor Suvorov Программист/преподаватель C++ 5 октября 2023

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

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

Ну и да, лигатуры Никита упоминает, что хорошо: fi —один code point, один кластер, одна лигатура, а букв как бы две.

А потом начинается. ﷽ — один code point и один кластер. ᄀᄀᄀ각ᆨᆨ — выделяется как один символ, а вот стирается в текстовом поле уже кусочками. Сколько тут кластеров? Что происходит с арабской вязью (когда форма букв меняется в зависимости от того что рядом => с обрезкой некоторые сложности), корейским (когда иероглифы набираются из нескольких букв) или китайским (когда набирается фонетически) — очень интересно и мне неизвестно.

  Развернуть 1 комментарий

@yeputons, я ничего не знаю про арабский, немножко знаю про корейский и давно пользуюсь лигатурами.

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

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

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

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

  Развернуть 1 комментарий

😎

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

Что вообще здесь происходит?


Войти  или  Вступить в Клуб