Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 16.10.22 07:26
Оценка: -3 :)
На 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# насквозь кривые (потому что там два байта на символ) и
не поддерживают модные смайлики и японские символы (а это важно для поколения анимешников!).
Наличие смайликов суперкритично для вставки такого текстового редактора в различные мессенжеры.

«Represents text as a sequence of UTF-16 code units»,
«Each code point is encoded using UTF-16 encoding», говорит нам MSDN:
https://learn.microsoft.com/en-us/dotnet/api/system.string?view=net-6.0

Вы говорите, что программист на C# легко найдёт работу
Автор: Эйнсток Файр
Дата: 15.10.22
. Допустим, что он последний раз программировал на C# в 2005-м году.
Он знает классы String, Encoding и StringBuilder.
А на собеседовании его завалят. Смайлики! Он не в состоянии обработать смайлики в тексте! 👩‍🔬
Отредактировано 16.10.2022 7:52 Эйнсток Файр . Предыдущая версия .
c# юникод смайлик
Re: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 16.10.22 08:20
Оценка: -1
Например, есть такое предложение:
https://github.com/dotnet/runtime/issues/933
https://github.com/dotnet/corefxlab/issues/2350

как оно сочетается с библиотекой unicode.net ?

А здесь?
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-11.0/utf8-string-literals
https://gsferreira.com/archive/2022/csharp-11-utf-8-string-literals-ignore-everything-you-have-seen-so-far/
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-11#utf-8-string-literals
https://github.com/dotnet/roslyn/issues/60644

Если дистрибутив не поддерживает C# 11:
$ csc -langversion:? | grep "(default)"
9.0 (default)
То застрелиться самому, или искать мейнтейнеров (чтобы застрелить их)?

Stackoverflow предлагает плохие практики:
https://ru.stackoverflow.com/questions/146083/Как-на-c-перевернуть-строку-было-123-стало-321
Отредактировано 16.10.2022 8:54 Эйнсток Файр . Предыдущая версия . Еще …
Отредактировано 16.10.2022 8:39 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 8:34 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 8:31 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 8:28 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 8:25 Эйнсток Файр . Предыдущая версия .
Re: Как написать редактор текстов на C#?
От: xma  
Дата: 16.10.22 08:51
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Как написать редактор текстов на C#?


двусвязный список для символов ?

помню в универе за вечер в качестве лабы — написал пейнт под дос (не полноценный конечно, как был под windows — но фигуры можно было рисовать), а также текстовый редактор (тоже под дос) но там я схалтурил и реализовал алгоритм в лоб, поэтому на текстах чутка минимального большего размера — всё жутко тормозило .. (но я естественно при сдаче — об этом скромно умолчал)
Отредактировано 16.10.2022 8:51 xma . Предыдущая версия .
Re: Как написать редактор текстов на C#?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 16.10.22 08:54
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

How to build a unicode string with emojis in c#?

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. Не?
и солнце б утром не вставало, когда бы не было меня
Re[2]: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 16.10.22 08:55
Оценка:
S> То есть использовать Encoding.UTF32. Не?

Да, но нет. Лишние аллокации памяти и всё такое.
Re[3]: Как написать редактор текстов на C#?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 16.10.22 09:06
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

S>> То есть использовать Encoding.UTF32. Не?


ЭФ>Да, но нет. Лишние аллокации памяти и всё такое.

UTF-8 и UTF-32

Ну для уменьшения аллокаций есть например Utf8String type
и солнце б утром не вставало, когда бы не было меня
Re[4]: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 16.10.22 09:13
Оценка:
Хочу сказать, что не вижу в интернете простого примера
как развернуть строку "👩‍🔬: 🙈, 🙉, 🙊.".

S> Ну для уменьшения аллокаций есть например Utf8String type


Да, уже упомянул эту багу в своём втором сообщении топика.
Проблема в том, что этого класса ещё нет, и компилятора C# 11 у меня нет.

А если класс и есть, то в хитрозапрятанной библиотеке:
https://learn.microsoft.com/en-us/dotnet/api/microsoft.azure.cosmos.core.utf8.utf8string
https://github.com/microsoft/HybridRow/blob/main/src/Core/Core/Utf8/Utf8String.cs

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.

Отредактировано 16.10.2022 9:43 Эйнсток Файр . Предыдущая версия . Еще …
Отредактировано 16.10.2022 9:35 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 9:34 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 9:20 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 9:18 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 9:16 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 9:15 Эйнсток Файр . Предыдущая версия .
Отредактировано 16.10.2022 9:13 Эйнсток Файр . Предыдущая версия .
Re: Как написать редактор текстов на C#?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 16.10.22 10:11
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Начнём с того, что юникод 8.0 охватывает более 120 000 символов из более 129 письменностей.

ЭФ>log(2, 120 000) = 16.872674880271
ЭФ>это значит, что все символы в два байта не влезают.
Это верно

ЭФ>Старые строки в C# насквозь кривые (потому что там два байта на символ) и

ЭФ>не поддерживают модные смайлики и японские символы (а это важно для поколения анимешников!).
За смайлики не знаю, но с японскими символами работаю около 12и лет через C# строки и никаких проблем пока не обнаружил. Все за редким исключением находятся в UCS.
ЭФ>Наличие смайликов суперкритично для вставки такого текстового редактора в различные мессенжеры.

Вот тут не очень понимаю, причем тут C# и его способ представления символов? Чем он мешает работе редактора? Для редактора нужно уметь отображать символы на графическом устройстве, брать текст на входе, отдавать на выходе. Отображением занимается шрифт, там фактически лежат инструкции по отрисовке глифов, их размеры, отступы, они не привязаны к C# представлению строк. Вход-выход текста в редактор можно вполне реализовать через юникод.

ЭФ>Вы говорите, что программист на C# легко найдёт работу
Автор: Эйнсток Файр
Дата: 15.10.22
. Допустим, что он последний раз программировал на C# в 2005-м году.

ЭФ>Он знает классы String, Encoding и StringBuilder.
ЭФ>А на собеседовании его завалят. Смайлики! Он не в состоянии обработать смайлики в тексте! 👩‍🔬
Что подразумевается под словом "обработать"?
Если нужно отобразить смайлик на устройстве и человек когда-то слышал об юникоде и в состоянии открыть хотя бы википедию, то для отображения смайлика ему не потребуется String, Encoding и StringBuilder. Нужно лишь понять, как в шрифте найти глиф, соотвествующий закодированному символу. Для этого есть API в соотвествующих библиотеках по работе со шрифтами.

Создание редактора, поддерживающего нюансы юникода — задача не формата собеседования. Но посмотреть, ход мыслей кандидата при получении такого задания — было бы прикольно.
Re[2]: Как написать редактор текстов на C#?
От: syrompe  
Дата: 16.10.22 13:05
Оценка: +1 -1
xma>двусвязный список для символов ?

Rope (data structure)
Re: Как написать редактор текстов на C#?
От: Baiker  
Дата: 16.10.22 19:12
Оценка: +2
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>На stackoverflow сказали что это очень объёмный вопрос, не подходящий для формата их сайта

ЭФ>Значит это отличная тема, для того, чтобы обсудить её на форуме!

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

ЭФ>Вы говорите, что программист на C# легко найдёт работу
Автор: Эйнсток Файр
Дата: 15.10.22
. Допустим, что он последний раз программировал на C# в 2005-м году.


Ну так это не сюда — это на курсы повышения квалификации!
Re[2]: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 17.10.22 02:08
Оценка:
B> на курсы повышения квалификации!

Ну почитайте учебные материалы какого-нибудь metanit. Там ничего нужного не написано, недостаточная глубина погружения в фактический материал.
Re: Как написать редактор текстов на C#?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.10.22 08:50
Оценка: +2
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Начнём с того, что юникод 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# легко найдёт работу
Автор: Эйнсток Файр
Дата: 15.10.22
. Допустим, что он последний раз программировал на C# в 2005-м году.

ЭФ>Он знает классы String, Encoding и StringBuilder.
ЭФ>А на собеседовании его завалят. Смайлики! Он не в состоянии обработать смайлики в тексте! 👩‍🔬
Внезапно в состоянии.
Re: Как написать редактор текстов на C#?
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.10.22 15:45
Оценка: +4
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>На 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# легко найдёт работу
Автор: Эйнсток Файр
Дата: 15.10.22
. Допустим, что он последний раз программировал на C# в 2005-м году.

ЭФ>Он знает классы String, Encoding и StringBuilder.
ЭФ>А на собеседовании его завалят. Смайлики! Он не в состоянии обработать смайлики в тексте! 👩‍🔬
Это вас вообще куда-то не туда повело. Какая разница, кого и где завалят? Почему вас так волнует наличие смайликов на собеседованиях? Почему вы решили, что "он" не в состоянии обработать смайлики?
Каша. В голове — каша.
1. Разбираемся, для какой целевой аудитории и для каких задач мы пишем редактор.
2. Разбираемся, как будет устроена информационная архитектура редактора.
3. Разбираемся, какие отдельные действия будет выполнять пользователь, с какой относительной и абсолютной частотой.
4. Разбираемся, как будет устроена архитектура самого редактора.
5. Разбираемся, как реализовать каждый элемент архитектуры.

Смайлики тут появляются дважды — как нефункциональное требование в п.1, и как подробность реализации в п.5.

Всё. Действуйте по плану, при затруднениях пишите вопросы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Как написать редактор текстов на C#?
От: Mr.Delphist  
Дата: 26.10.22 14:46
Оценка: -1
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Начнём с того, что юникод 8.0 охватывает более 120 000 символов из более 129 письменностей.

ЭФ>log(2, 120 000) = 16.872674880271
ЭФ>это значит, что все символы в два байта не влезают.

Не надо путать символ и глиф. Например, лигатуры или те же эмодзи — символов несколько, а внешне глиф — один (и при навигации по тексту курсор должен проскакивать все эти символы за один раз как единое целое).

Ещё один аспект, про который надо помнить — поддержка со стороны ОС. Например, у эмодзи есть модификаторы: гендерный, расовый и т.д. И если у нас есть эмодзи "китаянка делает facepalm", то на старых версиях ОС оно может нарисовать вместо одного "правильного" несколько разных глифов: "дефолтный фейспалм", далее глиф "венерино зеркало", а прочие модификаторы вообще проигнорировать или нарисовать на каждый из них глиф-квадратик (default placeholder). Касается не только винды, но и мобильных осей (к слову, Apple обычно быстрее всех начинает поддержку новых эмодзи)
Re[2]: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 26.10.22 14:53
Оценка:
MD> символов несколько, а внешне глиф — один

Кодепоинтов несколько. Я бы не сказал, что символов.

https://stackoverflow.com/questions/27331819/whats-the-difference-between-a-character-a-code-point-a-glyph-and-a-grapheme

Кроме того, не надо мне тыкать глифами. Глиф — это только часть графемы:

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).

Отредактировано 26.10.2022 15:06 Эйнсток Файр . Предыдущая версия . Еще …
Отредактировано 26.10.2022 15:04 Эйнсток Файр . Предыдущая версия .
Отредактировано 26.10.2022 15:03 Эйнсток Файр . Предыдущая версия .
Отредактировано 26.10.2022 15:01 Эйнсток Файр . Предыдущая версия .
Отредактировано 26.10.2022 14:58 Эйнсток Файр . Предыдущая версия .
Re[3]: Как написать редактор текстов на C#?
От: Mr.Delphist  
Дата: 27.10.22 09:03
Оценка:
Здравствуйте, Эйнсток Файр, Вы писали:

ЭФ>Кодепоинтов несколько. Я бы не сказал, что символов.


Тут под символом я понимаю один дотнетный char
Re[2]: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 01.11.22 08:12
Оценка: 14 (1)
S> То есть использовать Encoding.UTF32. Не?

Оказывается, начиная с Core, есть такой класс Rune в System.Text (а в mono его вроде нет):
https://learn.microsoft.com/en-us/dotnet/api/system.text.rune?view=net-6.0

а чтобы эти руны в строки склеивать есть ReadOnlySpan<T>

АДНАКА, я поискал такой код на github (чтобы там было ReadOnlySpan<Rune>) и не нашел.
В интернете тоже не густо...


Говорят, что есть курс на PluralSight
https://www.stevejgordon.co.uk/string-manipulation-in-csharp-best-practices

Unfortunately, Pluralsight's products are not available in your area at this time.

Отредактировано 01.11.2022 8:17 Эйнсток Файр . Предыдущая версия . Еще …
Отредактировано 01.11.2022 8:15 Эйнсток Файр . Предыдущая версия .
Re[4]: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 01.11.22 08:26
Оценка:
MD> Тут под символом я понимаю один дотнетный char

https://learn.microsoft.com/en-us/dotnet/standard/base-types/character-encoding-introduction#grapheme-clusters

один Grapheme Cluster — это строка, вот мой пруф:
https://github.com/microsoft/referencesource/blob/master/mscorlib/system/globalization/textelementenumerator.cs#L120
Re: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 01.11.22 08:43
Оценка:
Следующая у меня проблема — это как рисовать.
Firefox символы показывает, а вот текстовый редактор — нет, причём я перебрал все шрифты, не подходит ни один.
То есть, в системе есть как минимум один Unicode-дный шрифт (им и рисует firefox), но к программам это почему-то не относится.
Отредактировано 01.11.2022 8:44 Эйнсток Файр . Предыдущая версия .
Re[2]: Как написать редактор текстов на C#?
От: Эйнсток Файр Мухосранск Странный реагент
Дата: 01.11.22 09:01
Оценка:
S> причем тут C# и его способ представления символов? Чем он мешает работе редактора?

Редактор редактирует модель текста. Бывает два типа:
— текстовые редакторы
— текстовые процессоры

В текстовых редакторах модель текста попроще. Текст состоит из строк, строки состоят из символов.

В текстовых процессорах модель посложнее. Есть "Стили", они применяются к фрагментам текста. Есть структура текста (заголовки, абзацы).

Если рассматривать Grapheme Clusters — то это глубоко внутренняя проблема кодировки Unicode.
Простой текстовый редактор работает с одной Grapheme Cluster как с одним знакоместом (прямоугольником),

поэтому можно вообще посчитать, сколько каких Grapheme Cluster-ов в файле в штуках
и перекодировать всё во внутреннюю кодировку с одинаковой битностью, с которой потом и работать.

А для того, чтобы не писать отдельный код для 8, 16, 32 битов на символ — использовать классы-шаблоны и типизировать их типами-структурами такого размера.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.