Начнём с того, что юникод 8.0 охватывает более 120 000 символов из более 129 письменностей.
log(2, 120 000) = 16.872674880271
это значит, что все символы в два байта не влезают.
Старые строки в C# насквозь кривые (потому что там два байта на символ) и
не поддерживают модные смайлики и японские символы (а это важно для поколения анимешников!).
Наличие смайликов суперкритично для вставки такого текстового редактора в различные мессенжеры.
. Допустим, что он последний раз программировал на C# в 2005-м году.
Он знает классы String, Encoding и StringBuilder.
А на собеседовании его завалят. Смайлики! Он не в состоянии обработать смайлики в тексте! 👩🔬
Если дистрибутив не поддерживает C# 11:
$ csc -langversion:? | grep "(default)"
9.0 (default)
То застрелиться самому, или искать мейнтейнеров (чтобы застрелить их)?
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Как написать редактор текстов на C#?
двусвязный список для символов ?
помню в универе за вечер в качестве лабы — написал пейнт под дос (не полноценный конечно, как был под windows — но фигуры можно было рисовать), а также текстовый редактор (тоже под дос) но там я схалтурил и реализовал алгоритм в лоб, поэтому на текстах чутка минимального большего размера — всё жутко тормозило .. (но я естественно при сдаче — об этом скромно умолчал)
I've been using the following code to translate unicode parts that are taken from a text file in a format of string array ["1F3F3", "FE0F", "200D", "1F308"]. The mentioned unicode parts are a sample of 🏳️🌈 emoji and are taken from unicode.org resource(#1553 on the page).
public static void PrintEmoji(params string[] unicodeParts)
{
var unicodeBuilder = new StringBuilder();
foreach (var unicodePart in unicodeParts)
{
unicodeBuilder.Append(char.ConvertFromUtf32(Convert.ToInt32(unicodePart,16)));
}
if(unicodeBuilder.ToString() is var unicodeResult && !string.IsNullOrWhiteSpace(unicodeResult))
Console.WriteLine(unicodeResult);
}
То есть использовать Encoding.UTF32. Не?
и солнце б утром не вставало, когда бы не было меня
Хочу сказать, что не вижу в интернете простого примера
как развернуть строку "👩🔬: 🙈, 🙉, 🙊.".
S> Ну для уменьшения аллокаций есть например Utf8String type
Да, уже упомянул эту багу в своём втором сообщении топика.
Проблема в том, что этого класса ещё нет, и компилятора C# 11 у меня нет.
This repo contains designs proposed by the CLR team but not yet committed for inclusion in either the C# language or the standard .NET Framework. The types included here (e.g. Utf8Span) may never appear in the official standard.
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Начнём с того, что юникод 8.0 охватывает более 120 000 символов из более 129 письменностей. ЭФ>log(2, 120 000) = 16.872674880271 ЭФ>это значит, что все символы в два байта не влезают.
Это верно
ЭФ>Старые строки в C# насквозь кривые (потому что там два байта на символ) и ЭФ>не поддерживают модные смайлики и японские символы (а это важно для поколения анимешников!).
За смайлики не знаю, но с японскими символами работаю около 12и лет через C# строки и никаких проблем пока не обнаружил. Все за редким исключением находятся в UCS. ЭФ>Наличие смайликов суперкритично для вставки такого текстового редактора в различные мессенжеры.
Вот тут не очень понимаю, причем тут C# и его способ представления символов? Чем он мешает работе редактора? Для редактора нужно уметь отображать символы на графическом устройстве, брать текст на входе, отдавать на выходе. Отображением занимается шрифт, там фактически лежат инструкции по отрисовке глифов, их размеры, отступы, они не привязаны к C# представлению строк. Вход-выход текста в редактор можно вполне реализовать через юникод.
ЭФ>Вы говорите, что программист на C# легко найдёт работу
. Допустим, что он последний раз программировал на C# в 2005-м году. ЭФ>Он знает классы String, Encoding и StringBuilder. ЭФ>А на собеседовании его завалят. Смайлики! Он не в состоянии обработать смайлики в тексте! 👩🔬
Что подразумевается под словом "обработать"?
Если нужно отобразить смайлик на устройстве и человек когда-то слышал об юникоде и в состоянии открыть хотя бы википедию, то для отображения смайлика ему не потребуется String, Encoding и StringBuilder. Нужно лишь понять, как в шрифте найти глиф, соотвествующий закодированному символу. Для этого есть API в соотвествующих библиотеках по работе со шрифтами.
Создание редактора, поддерживающего нюансы юникода — задача не формата собеседования. Но посмотреть, ход мыслей кандидата при получении такого задания — было бы прикольно.
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>На stackoverflow сказали что это очень объёмный вопрос, не подходящий для формата их сайта ЭФ>Значит это отличная тема, для того, чтобы обсудить её на форуме!
Но ты ничего не обсуждаешь! Ты просто вбросил какую-то галиматью про смайлики! Ты вообще в курсе что такое программирование?? Судя по посту, это какой-то "гуманитарный" высер чела, который сам не знает, чего хочет и что именно у него является проблемой.
ЭФ>Вы говорите, что программист на C# легко найдёт работу
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Начнём с того, что юникод 8.0 охватывает более 120 000 символов из более 129 письменностей. ЭФ>log(2, 120 000) = 16.872674880271 ЭФ>это значит, что все символы в два байта не влезают.
Поэтому в UTF16 один символ может быть закодирован одним или двумя code unit.
ЭФ>В текущей редакции 15.0.0, https://www.unicode.org/versions/Unicode15.0.0/ ЭФ>опубликованной 2022-09-13, содержится 149186 символов (то есть ещё больше).
ЭФ>Старые строки в C# насквозь кривые (потому что там два байта на символ) и ЭФ>не поддерживают модные смайлики и японские символы (а это важно для поколения анимешников!). ЭФ>Наличие смайликов суперкритично для вставки такого текстового редактора в различные мессенжеры.
Строки в C# хранятся в UTF-16
ЭФ>Вы говорите, что программист на C# легко найдёт работу
. Допустим, что он последний раз программировал на C# в 2005-м году. ЭФ>Он знает классы String, Encoding и StringBuilder. ЭФ>А на собеседовании его завалят. Смайлики! Он не в состоянии обработать смайлики в тексте! 👩🔬
Внезапно в состоянии.
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>На stackoverflow сказали что это очень объёмный вопрос, не подходящий для формата их сайта ЭФ>https://stackoverflow.com/questions/18730691/how-to-make-a-custom-text-editor ЭФ>Значит это отличная тема, для того, чтобы обсудить её на форуме!
ЭФ>Начнём с того, что юникод 8.0 охватывает более 120 000 символов из более 129 письменностей. ЭФ>log(2, 120 000) = 16.872674880271 ЭФ>это значит, что все символы в два байта не влезают.
Непонятно, почему вы решили начать обсуждение текстового редактора с юникода.
ЭФ>В текущей редакции 15.0.0, https://www.unicode.org/versions/Unicode15.0.0/ ЭФ>опубликованной 2022-09-13, содержится 149186 символов (то есть ещё больше).
Ну, как бы вы никакой америки тут не открыли. Да, юникод — большой. И что? Вы не в курсе того, как код-поинты укладываются в байты при помощи разных кодировок?
ЭФ>Старые строки в C# насквозь кривые (потому что там два байта на символ) и ЭФ>не поддерживают модные смайлики и японские символы (а это важно для поколения анимешников!).
Ага, то есть не в курсе. Рекомендую разобраться с понятием "кодировка", и с тем, какие кодировки поддерживает дотнет.
ЭФ>Наличие смайликов суперкритично для вставки такого текстового редактора в различные мессенжеры.
Вот это — то, с чего надо было начинать. То есть — набор функциональных и нефункциональных требований.
Редактор для исходного кода; редактор для художественной книги; редактор для научных статей; редактор текстов для мессенджеров — это совершенно разные ниши, с малопересекающимися требованиями.
ЭФ>Вы говорите, что программист на C# легко найдёт работу
. Допустим, что он последний раз программировал на C# в 2005-м году. ЭФ>Он знает классы String, Encoding и StringBuilder. ЭФ>А на собеседовании его завалят. Смайлики! Он не в состоянии обработать смайлики в тексте! 👩🔬
Это вас вообще куда-то не туда повело. Какая разница, кого и где завалят? Почему вас так волнует наличие смайликов на собеседованиях? Почему вы решили, что "он" не в состоянии обработать смайлики?
Каша. В голове — каша.
1. Разбираемся, для какой целевой аудитории и для каких задач мы пишем редактор.
2. Разбираемся, как будет устроена информационная архитектура редактора.
3. Разбираемся, какие отдельные действия будет выполнять пользователь, с какой относительной и абсолютной частотой.
4. Разбираемся, как будет устроена архитектура самого редактора.
5. Разбираемся, как реализовать каждый элемент архитектуры.
Смайлики тут появляются дважды — как нефункциональное требование в п.1, и как подробность реализации в п.5.
Всё. Действуйте по плану, при затруднениях пишите вопросы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Эйнсток Файр, Вы писали:
ЭФ>Начнём с того, что юникод 8.0 охватывает более 120 000 символов из более 129 письменностей. ЭФ>log(2, 120 000) = 16.872674880271 ЭФ>это значит, что все символы в два байта не влезают.
Не надо путать символ и глиф. Например, лигатуры или те же эмодзи — символов несколько, а внешне глиф — один (и при навигации по тексту курсор должен проскакивать все эти символы за один раз как единое целое).
Ещё один аспект, про который надо помнить — поддержка со стороны ОС. Например, у эмодзи есть модификаторы: гендерный, расовый и т.д. И если у нас есть эмодзи "китаянка делает facepalm", то на старых версиях ОС оно может нарисовать вместо одного "правильного" несколько разных глифов: "дефолтный фейспалм", далее глиф "венерино зеркало", а прочие модификаторы вообще проигнорировать или нарисовать на каждый из них глиф-квадратик (default placeholder). Касается не только винды, но и мобильных осей (к слову, Apple обычно быстрее всех начинает поддержку новых эмодзи)
Кроме того, не надо мне тыкать глифами. Глиф — это только часть графемы:
A glyph is an image, usually stored in a font (which is a collection of glyphs), used to represent graphemes or parts thereof.
A grapheme is a sequence of one or more code points that are displayed as a single, graphical unit that a reader recognizes as a single element of the writing system.
character is an individual unit of text composed of one or more graphemes.
Unicode provides rules for the interpretation of juxtaposed graphemes as individual characters.
Unicode rules allow some juxtaposed graphemes to be interpreted as other graphemes
that already have their own code points (precomposed forms).
Следующая у меня проблема — это как рисовать.
Firefox символы показывает, а вот текстовый редактор — нет, причём я перебрал все шрифты, не подходит ни один.
То есть, в системе есть как минимум один Unicode-дный шрифт (им и рисует firefox), но к программам это почему-то не относится.
S> причем тут C# и его способ представления символов? Чем он мешает работе редактора?
Редактор редактирует модель текста. Бывает два типа:
— текстовые редакторы
— текстовые процессоры
В текстовых редакторах модель текста попроще. Текст состоит из строк, строки состоят из символов.
В текстовых процессорах модель посложнее. Есть "Стили", они применяются к фрагментам текста. Есть структура текста (заголовки, абзацы).
Если рассматривать Grapheme Clusters — то это глубоко внутренняя проблема кодировки Unicode.
Простой текстовый редактор работает с одной Grapheme Cluster как с одним знакоместом (прямоугольником),
поэтому можно вообще посчитать, сколько каких Grapheme Cluster-ов в файле в штуках
и перекодировать всё во внутреннюю кодировку с одинаковой битностью, с которой потом и работать.
А для того, чтобы не писать отдельный код для 8, 16, 32 битов на символ — использовать классы-шаблоны и типизировать их типами-структурами такого размера.