В чем разница между символом, кодовой точкой, глифом и графемой?


162

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

Наблюдая за тем, как эти термины используются в таких документах, как JavaScript Матиаса Биненса с проблемой юникода или статья в Википедии об унификации ханьцев , я понял, что эти концепции не одно и то же и их опасно объединять, но я вроде изо всех сил пытается понять, что означает каждый термин .

Консорциум Unicode предлагает глоссарий для объяснения этого материала, но он полон таких «определений»:

Абстрактный персонаж . Единица информации, используемая для организации, управления или представления текстовых данных. ...

...

Характер . ... (2) Синоним абстрактного персонажа. (3) Базовая единица кодирования для кодировки символов Unicode. ...

...

Глиф . (1) Абстрактная форма, представляющая одно или несколько изображений глифов. (2) Синоним изображения глифа. При отображении символьных данных Unicode один или несколько глифов могут быть выбраны для изображения конкретного символа.

...

Графема . (1) Минимально отличительная единица письма в контексте конкретной системы письма. ...

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

Поэтому я ищу тайную мудрость у тех, кто более образован, чем я. Чем именно каждая из этих концепций отличается друг от друга и при каких обстоятельствах они не будут иметь однозначных отношений друг с другом?


Существует множество очень разных систем письма для разных языков. Таким образом, существуют разные взгляды на проблему письма, и за этим стоит долгая история. IMHO, полезно иметь это в виду, потому что Unicode пытается охватить все . (
Пабло Х

Ответы:


258
  • Персонаж - это перегруженный термин, который может означать многое.

  • Код точка является атомной единицей информации. Текст - это последовательность кодовых точек. Каждая кодовая точка - это число, значение которого определяется стандартом Unicode.

  • Блок - кода является единицей хранения в части кодированной точки коды. В UTF-8 это означает 8 бит, в UTF-16 - 16 бит. Одна кодовая единица может представлять полную кодовую точку или часть кодовой точки. Например, глиф снеговика ( ) представляет собой одну кодовую точку, но 3 кодовых единицы UTF-8 и 1 кодовую единицу UTF-16.

  • Графема представляет собой последовательность из одного или нескольких кодовых точек, которые отображаются в виде единого графического блока , что читатель распознает как единый элемент системы записи. Например, оба aи äявляются графемами, но они могут состоять из нескольких кодовых точек (например, äмогут быть две кодовые точки, одна для базового символа, aа затем одна для диэрезиса; но есть также альтернативная, устаревшая, единственная кодовая точка, представляющая эту графему. ). Некоторые кодовые точки никогда не являются частью какой-либо графемы (например, несоединение с нулевой шириной или направленное переопределение).

  • Глиф представляет собой изображение, обычно хранится в шрифте (который представляет собой набор глифов), используется для представления графем или их части. Шрифты могут составлять несколько глифов в единое представление, например, если указанное выше äявляется одной кодовой точкой, шрифт может выбрать отображение этого как двух отдельных пространственно перекрываемых глифов. Для OTF таблицы шрифтов GSUB и GPOS содержат информацию о подстановке и позиционировании для выполнения этой работы. Шрифт также может содержать несколько альтернативных глифов для одной и той же графемы.


4
Я только что отправил правку, которая изменила порядок кодовой точки и кодовой единицы. Я согласен с вами, что на втором месте должна стоять кодовая единица. Что касается «неуместности», я подозреваю, что этот ответ служит другой цели, чем я. Я думаю, что очень важно собрать все 5 этих терминов в одном месте. Последнее, что я хочу, - это погуглить, «в чем разница между глифом, графемой, единицей кода и точкой кода, и мне нужно получить ответ в двух местах. Во многих дискуссиях все эти термины используются в обсуждениях, но редко. Я вижу обсуждение с другими четырьмя, но не кодовыми единицами.
Мика Золту 01

1
Так, например, '\ uD83D \ uDC0A' (который показывает смайлик крокодила), каковы кодовые точки, графемы и т. Д.? В частности, как она относится к .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)и .charCodeAt(1)результаты?
qbolec

3
@qbolec: это две кодовые единицы UTF-16, выражающие одну кодовую точку (U + 1F40A), и, учитывая, что это эмодзи, предположительно, это отдельная отдельная графема.
Kerrek SB

2
@ TomPažourek: В декомпозированной канонизации он представлен двумя кодовыми точками ( aплюс «объединение диакритических знаков»); в составной канонизации он представлен одной кодовой точкой ( äиз старого унаследованного диапазона Latin-1). Канонизация Unicode - это тема, которую вы хотите исследовать, если это вас интересует. В мире с чистого листа были бы только базовые и комбинирующие символы, а не заранее созданные композиты.
Kerrek SB

1
@Kaushik: Я не уверен, что вы имеете в виду: кодовая единица - это единица хранения, да, но кодовая точка в целом требует нескольких единиц кода для хранения (кроме UTF-32).
Kerrek SB

1

Вне стандарта 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», которые признаны ошибочными, но сохраняются, потому что их очистка - непростая задача. Еще предстоит проделать работу, чтобы ужесточить терминологию, используемую в стандарте.

Предложение о добавлении ОБЪЕДИНЕНИЯ графем получило это неправильно , когда он заявил , что «графема последовательность одного или более закодированные символы , которые соответствуют тому , что пользователи думают как символы.» Вместо этого следует читать: «Последовательность из одной или нескольких графем составляет то, что пользователь считает символом». Тогда он мог бы использовать термин «последовательность графемы» отдельно от термина «последовательность символов». Оба термина полезны. «Последовательность графемы» аккуратно подразумевает процесс построения персонажа из более мелких частей. «Последовательность символов» означает то, что мы все обычно интуитивно понимаем: «Последовательность вещей, которые пользователь считает символами».

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

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


1
Осторожный -1; Я считаю это неправильным. Вы подразумеваете, что символ может состоять из множества графем, но всегда будет представлен одним глифом; Я думаю, что на самом деле все наоборот. Такие страницы, как en.wikipedia.org/wiki/N-diaeresis, предполагают, что комбинация буквы с диакритическим знаком (по крайней мере, тот, который меняет свое значение) образует отдельную новую графему, и что диакритический знак сам по себе не является графемой. Между тем, глифы явно составны s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.̯̖̝̯̟̜̥
Марк Эймери

Я ценю ответ, который только что увидел. Тем не менее, я все еще считаю, что ваше определение графем на самом деле неверно или, по крайней мере, не соответствует тому, как Unicode определяет это слово. Вы отвергаете идею, что графема состоит из символов как «все наоборот», но я немного покопался и нашел unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm, который буквально начинается с утверждения " Графемы - это последовательности одного или нескольких закодированных символов » .
Марк Эмери

И это утверждение продолжается: «... это соответствует тому, что пользователи считают персонажами». Даже термин «объединение графем », а также механизм, лежащий в основе этого термина, иллюстрируют то, что я сказал в начале своего ответа: то, что стандарт Unicode определяет как «символы», на самом деле является смесью графем и символов. Гораздо проще называть графемы «графемами», а символы - «персонажами», чем изобретать искажения, такие как « заранее составленные символы » и « кластеры графем ».
Бедный Йорик

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

@PoorYorick Я понял вашу точку зрения, прежде чем вы добавили это дальнейшее объяснение, я не поэтому спросил. Я просто попросил ссылки (лексика, научные статьи, технические стандарты, ...), потому что я не знал ни одного документа, в котором использовалась бы графема так, как вы ее интерпретируете. (Первые несколько результатов Google для графемы также не используют это слово по-вашему). Вы добавили цитату «Графема - это кодовая точка или символ. [...]» - но откуда она? В конце вы говорите «устоявшиеся значения обоих терминов». - Если это установлено, тогда ссылка на что-то, что использует этот термин таким образом.
TS
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.