Струнный класс на основе графем?


9

Мне интересно, почему у нас нет некоторых строковых классов, которые представляют строку графических кластеров Unicode вместо кодовых точек или символов. Мне кажется, что в большинстве приложений программистам было бы легче получить доступ к компонентам графемы, когда это необходимо, чем организовывать их из точек кода, что представляется необходимым, даже если только избежать случайного разбивания строки в «средней графеме» (по крайней мере, в теории). Внутренне строковый класс может использовать кодировку переменной длины, такую ​​как UTF-8, UTF-16, или в этом контексте даже UTF-32 имеет переменную длину; или реализовать подклассы для всех из них (и при желании настроить выбор во время выполнения, чтобы разные языки могли использовать свои оптимальные кодировки). Но если бы программисты могли «видеть» графемные блоки при проверке строки, не было бы


Я думаю, прошло немного времени, и теперь у нас есть пара языков, которые на самом деле делают это. : D
Трейказ

Ответы:


4

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

То есть абстракция, с которой вы обычно работаете, это скорее «экранный объект абзаца», например, для GTK: http://library.gnome.org/devel/pango/stable/pango-Layout-Objects.html

а не строка графемы, например: http://library.gnome.org/devel/pango/stable/pango-Glyph-Storage.html

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

Помимо такого рода практических вопросов, глифы, вероятно, не то, что вы хотите.

Во многих контекстах вы хотите использовать надлежащие атрибуты Unicode, показанные в этом API, например: http://library.gnome.org/devel/pango/stable/pango-Text-Processing.html#PangoLogAttr

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

Эти две спецификации описывают алгоритмы для нахождения различных видов границ:

Обработка текста включает в себя поиск этих границ с помощью алгоритмов, а затем работу с границами.

Если вы начнете понимать, насколько сложно правильно обрабатывать все языки, вы очень быстро поймете, что вам нужна библиотека, которая просматривает целые абзацы и обрабатывает их правильно. Windows, Mac, Linux (Qt и GTK) и Java поставляются с возможностями для этого, плюс есть, например , http://site.icu-project.org/ .

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.