От попыток разобраться в тонкостях современного Unicode у меня заболела голова. В частности, различие между кодовыми точками, символами, глифами и графемами - концепциями, которые в простейшем случае, при работе с английским текстом с использованием символов ASCII, все имеют однозначное отношение друг к другу, - вызывает у меня проблемы.
Наблюдая за тем, как эти термины используются в таких документах, как JavaScript Матиаса Биненса с проблемой юникода или статья в Википедии об унификации ханьцев , я понял, что эти концепции не одно и то же и их опасно объединять, но я вроде изо всех сил пытается понять, что означает каждый термин .
Консорциум Unicode предлагает глоссарий для объяснения этого материала, но он полон таких «определений»:
Абстрактный персонаж . Единица информации, используемая для организации, управления или представления текстовых данных. ...
...
Характер . ... (2) Синоним абстрактного персонажа. (3) Базовая единица кодирования для кодировки символов Unicode. ...
...
Глиф . (1) Абстрактная форма, представляющая одно или несколько изображений глифов. (2) Синоним изображения глифа. При отображении символьных данных Unicode один или несколько глифов могут быть выбраны для изображения конкретного символа.
...
Графема . (1) Минимально отличительная единица письма в контексте конкретной системы письма. ...
Большинство этих определений обладают качеством звучания очень академично и формально, но лишены качества смысла чего-либо или же переносят проблему определения на еще одну статью или раздел стандарта.
Поэтому я ищу тайную мудрость у тех, кто более образован, чем я. Чем именно каждая из этих концепций отличается друг от друга и при каких обстоятельствах они не будут иметь однозначных отношений друг с другом?
источник
Ответы:
Персонаж - это перегруженный термин, который может означать многое.
Код точка является атомной единицей информации. Текст - это последовательность кодовых точек. Каждая кодовая точка - это число, значение которого определяется стандартом Unicode.
Блок - кода является единицей хранения в части кодированной точки коды. В UTF-8 это означает 8 бит, в UTF-16 - 16 бит. Одна кодовая единица может представлять полную кодовую точку или часть кодовой точки. Например, глиф снеговика (
☃
) представляет собой одну кодовую точку, но 3 кодовых единицы UTF-8 и 1 кодовую единицу UTF-16.Графема представляет собой последовательность из одного или нескольких кодовых точек, которые отображаются в виде единого графического блока , что читатель распознает как единый элемент системы записи. Например, оба
a
иä
являются графемами, но они могут состоять из нескольких кодовых точек (например,ä
могут быть две кодовые точки, одна для базового символа,a
а затем одна для диэрезиса; но есть также альтернативная, устаревшая, единственная кодовая точка, представляющая эту графему. ). Некоторые кодовые точки никогда не являются частью какой-либо графемы (например, несоединение с нулевой шириной или направленное переопределение).Глиф представляет собой изображение, обычно хранится в шрифте (который представляет собой набор глифов), используется для представления графем или их части. Шрифты могут составлять несколько глифов в единое представление, например, если указанное выше
ä
является одной кодовой точкой, шрифт может выбрать отображение этого как двух отдельных пространственно перекрываемых глифов. Для OTF таблицы шрифтов GSUB и GPOS содержат информацию о подстановке и позиционировании для выполнения этой работы. Шрифт также может содержать несколько альтернативных глифов для одной и той же графемы.источник
.length
,.codePointAt(0)
,.codePointAt(1)
,.charCodeAt(0)
и.charCodeAt(1)
результаты?a
плюс «объединение диакритических знаков»); в составной канонизации он представлен одной кодовой точкой (ä
из старого унаследованного диапазона Latin-1). Канонизация Unicode - это тема, которую вы хотите исследовать, если это вас интересует. В мире с чистого листа были бы только базовые и комбинирующие символы, а не заранее созданные композиты.Вне стандарта Unicode символ - это отдельная единица текста, состоящая из одной или нескольких графем . То, что стандарт Unicode определяет как «символы», на самом деле представляет собой смесь графем и символов. Юникод предоставляет правила для интерпретации сопоставленных графем как отдельных символов.
Unicode , код точка представляет собой уникальный номер , присвоенный каждый символ Unicode (который является либо символом или графема).
К сожалению, правила Unicode позволяют интерпретировать некоторые сопоставленные графемы как другие графемы, которые уже имеют свои собственные кодовые точки ( предварительно составленные формы ). Это означает, что в Юникоде существует несколько способов представления символа. Нормализация Unicode решает эту проблему.
Глиф - это визуальное представление персонажа. Шрифт предоставляет набор глифов для определенного набора символов (не символов Юникода). Для каждого символа существует бесконечное количество возможных символов.
Ответ Марку Эмери
Во-первых, как я уже сказал, существует бесконечное количество возможных глифов для каждого символа, поэтому нет, символ не «всегда представлен одним глифом». Unicode не особо заботится о глифах, и то, что он определяет в диаграммах кода, определенно не являются глифами. Проблема в том, что они не все персонажи. Так что они?
Что больше: графема или персонаж? Как назвать те графические элементы в тексте, которые не являются буквами или знаками препинания? Один термин, который быстро приходит в голову, - это «графема». Это слово точно передает идею «графической единицы в тексте». Я предлагаю следующее определение: графема - это наименьший отдельный компонент письменного текста .
Можно пойти другим путем и сказать, что графемы состоят из символов, но тогда они будут называться «китайскими графемами», а все эти кусочки и части, из которых состоят китайские графемы, вместо этого следует называть «символами». Однако это все наоборот. Графемы - это отдельные маленькие кусочки и кусочки. Персонажи более развиты. Фразу «глифы могут быть составлены» было бы лучше сформулировать в контексте Unicode, поскольку «символы могут быть составными».
Unicode определяет символы, но также определяет графемы, которые должны быть составлены с другими графемами или символами. Созданные вами чудовища - прекрасный тому пример. Если они поймут, возможно, они получат свои собственные кодовые точки в более поздней версии Unicode;)
Во всем этом есть рекурсивный элемент. На более высоких уровнях графемы становятся символами, становятся графемами, но это графемы полностью вниз.
Ответ TS
В главе 1 стандарта говорится: «Кодировка символов Unicode эквивалентно трактует алфавитные символы, идеографические символы и символы, что означает, что они могут использоваться в любой комбинации и с одинаковой легкостью». Учитывая это утверждение, мы должны быть готовы к некоторому смешению терминов в стандарте. Иногда правильная терминология становится ясной только ретроспективно по мере разработки стандарта.
В формальных определениях языка часто бывает, что две фундаментальные вещи определяются в терминах друг друга. Например, в XML элемент определяется как начальный тег, за которым, возможно, следует контент, за которым следует конечный тег. Контент, в свою очередь, определяется как элемент, символьные данные или несколько других возможных вещей. Шаблон самореференциальных определений также подразумевается в стандарте Unicode:
Впервые столкнувшись с этими двумя определениями, читатель может возразить против первого определения на том основании, что кодовая точка является символом, но это не всегда верно. Последовательность из двух кодовых точек иногда кодирует одну кодовую точку при нормализации , и эта закодированная кодовая точка представляет символ, как показано на рисунке 2.7 . Последовательности кодовых точек, которые кодируют другие кодовые точки. Это становится немного сложнее, и мы даже не достигли уровня, на котором схемы кодирования символов, такие как UTF-8 , используются для кодирования кодовых точек в последовательности байтов.
В некоторых контекстах, например в научной статье о диакритических знаках , отдельные части символа могут появляться в тексте отдельно. В этом контексте отдельная часть символа может считаться символом, поэтому имеет смысл, чтобы стандарт Unicode также оставался гибким.
Как отметил Марк Эйвери, из персонажа можно составить более сложную вещь. То есть каждый символ при желании может служить графемой. Конечный результат всей композиции - это то, что «пользователь думает как персонаж». Похоже, что ни в стандарте, ни в этом обсуждении нет реального сопротивления идее, что на самом высоком уровне в тексте есть такие вещи, которые пользователь считает отдельными персонажами. Чтобы избежать перегрузки этого термина, мы можем использовать «графему» во всех случаях, когда мы хотим ссылаться на части, используемые для создания символа.
Иногда стандарт Unicode встречается повсюду с его терминологией. Например, в главе 3 UTF-8 определяется как «форма кодирования», тогда как в глоссарии «форма кодирования» определяется как что-то еще, а UTF-8 - как «схема кодирования символов». Другой пример - «Grapheme_Base» и «Grapheme_Extend», которые признаны ошибочными, но сохраняются, потому что их очистка - непростая задача. Еще предстоит проделать работу, чтобы ужесточить терминологию, используемую в стандарте.
Предложение о добавлении ОБЪЕДИНЕНИЯ графем получило это неправильно , когда он заявил , что «графема последовательность одного или более закодированные символы , которые соответствуют тому , что пользователи думают как символы.» Вместо этого следует читать: «Последовательность из одной или нескольких графем составляет то, что пользователь считает символом». Тогда он мог бы использовать термин «последовательность графемы» отдельно от термина «последовательность символов». Оба термина полезны. «Последовательность графемы» аккуратно подразумевает процесс построения персонажа из более мелких частей. «Последовательность символов» означает то, что мы все обычно интуитивно понимаем: «Последовательность вещей, которые пользователь считает символами».
Иногда программист действительно хочет работать на уровне последовательностей графем, поэтому должны быть доступны механизмы для проверки и управления этими последовательностями, но обычно при обработке текста достаточно оперировать «последовательностями символов» (что думает пользователь как персонаж) и позвольте системе управлять деталями нижнего уровня.
В каждом случае, рассмотренном до сих пор в этом обсуждении, будет более понятным использование «графемы» для обозначения неделимых компонентов и «символа» для обозначения составного объекта. Это использование также лучше отражает устоявшиеся значения обоих терминов.
источник