Яка різниця між символом, кодовою точкою, гліфом та графемою?


146

Намагаючись зрозуміти тонкощі сучасного Unicode, мені болить голова. Зокрема, відмінність між кодовими точками, символами, гліфами та графемами - поняттями, які, у найпростішому випадку, при роботі з англійським текстом, використовуючи символи ASCII, усі мають взаємозв'язок один з одним - викликають у мене неприємності.

Бачачи, як ці терміни використовуються в таких документах, як JavaScript Маттіаса Байненса, має проблему з унікодом або фрагмент Вікіпедії про об'єднання Хана , я зрозумів, що ці поняття не є тим самим і що їх небезпечно поєднувати, але я такий собі намагаючись зрозуміти, що означає кожен термін .

Консорціум Unicode пропонує словник для пояснення цього матеріалу, але він повний "визначень", таких як:

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

...

Характер . ... (2) Синонім абстрактного символу. (3) Основна одиниця кодування для кодування символів Unicode. ...

...

Гліф . (1) Абстрактна форма, яка представляє одне або кілька зображень гліфів. (2) Синонім зображення гліфа. Відображаючи дані символів Unicode, для зображення певного символу може бути обраний один або більше гліфів.

...

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

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

Тож я шукаю прихованої мудрості тих, хто більше вчився, ніж я. Чим саме різняться кожне з цих понять одне від одного, і за яких обставин вони б не мали стосунків один до одного?


Існує багато дуже різних систем письма, для багатьох різних мов. Таким чином, існують різні погляди на проблему написання, а також є довга історія. IMHO корисно мати це на увазі, оскільки Unicode намагається охопити все . (Чи допитливий той самий чи різний персонаж? Радикали Канджі? Хангул? Діакритики?
Пабло Н

Відповіді:


225
  • Характер - це перевантажений термін, ніж може означати багато речей.

  • Код точка є атомної одиницею інформації. Текст - це послідовність точок коду. Кожна точка коду - це число, яке надається значенням стандарту Unicode.

  • Блок - коду є одиницею зберігання в частині кодованої точки коди. У UTF-8 це означає 8-біт, в UTF-16 це означає 16-біт. Одинична кодова одиниця може представляти повну кодову точку або частину кодової точки. Наприклад, глиф сніговика ( ) є єдиною кодовою точкою, але 3 кодовими кодами UTF-8 та 1 кодовою одиницею UTF-16.

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

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


4
Я щойно подав правку, яка перевпорядкувала порядок кодової точки та блоку коду. Я згоден з вами, що блок-код повинен прийти на друге місце. Щодо того, що ви "не на місці", я підозрюю, що ви бачите, що ця відповідь відповідає іншій меті, ніж я. Я думаю, що велике значення має всі 5 цих термінів в одному місці. Останнє, що я хочу, - це гугл за тим, «чим відрізняється гліф, графема, кодова одиниця та кодова точка, і відповідь доводиться отримувати в двох місцях. У багатьох дискусіях ці терміни використовуються в дискусії, рідко Я бачу дискусію з іншими 4, але не з кодовою одиницею
Міхей Золту

1
Так, наприклад, "\ uD83D \ uDC0A" (який відображає смайли крокодила), що таке кодові точки, графеми тощо? Зокрема, як вона ставиться до .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)і .charCodeAt(1)результати?
qbolec

3
@qbolec: Це два кодові блоки UTF-16, що виражають єдину кодову точку (U + 1F40A), і, враховуючи, що це емоджи, це, мабуть, своя, окрема графема.
Керрек СБ

2
@ TomPažourek: при розкладеній канонізації вона представлена ​​двома кодовими точками ( aплюс "поєднання діакритичного"); у складеній канонізації він представлений однією кодовою точкою ( äзі старої спадщини Латинської-1). Канікалізація Unicode - це предмет, який ви хочете дослідити, якщо це вас цікавить. У світі з чистого сланця існували б лише основи та поєднання символів, а не попередньо складених композитів.
Керрек СБ

1
@Kaushik: Я не впевнений, що ти маєш на увазі: одиниця коду - це одиниця зберігання, так, але для кодової точки в цілому потрібні кілька кодових одиниць для зберігання (за винятком UTF-32).
Керрек СБ

1

Поза стандартом Unicode символ - це окрема одиниця тексту, що складається з однієї або декількох графем . Те, що стандарт Unicode визначає як "символи", - це насправді поєднання графем та символів. 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", які визнаються помилками, але вони зберігаються, оскільки їх очищення - це завдання. Ще потрібно виконати роботу з посиленням термінології, що використовується стандартом.

Пропозиція про додавання ОБ'ЄДНАННЯ графем отримало це неправильно , коли він заявив , що «графема послідовність одного або більше закодовані символи , які відповідають тому , що користувачі думають як символи.» Натомість слід прочитати: "Послідовність однієї або декількох графем складається з того, що користувач вважає персонажем". Тоді він міг би використовувати термін "графемна послідовність" виразно від терміна "послідовність символів". Обидва терміни корисні. "послідовність графем" акуратно передбачає процес побудови персонажа з менших шматочків. "послідовність символів" означає те, що ми всі зазвичай інтуїтивно це означає: "Послідовність речей, які користувач вважає символами".

Іноді програміст дійсно хоче оперувати на рівні послідовностей графем, тому механізми перевірки та маніпулювання цими послідовностями повинні бути доступними, але, як правило, при обробці тексту достатньо оперувати "послідовностями символів" (про що думає користувач як персонаж) і нехай система керує деталями нижчого рівня.

У кожному випадку, про який йде мова в цій дискусії, то чистіше використовувати «графему» для позначення нероздільних компонентів, а «характер» для позначення складеної сутності. Це використання також краще відображає давно встановлені значення обох термінів.


Обережний -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, який буквально починається з заяви " Графеми - це послідовності одного або декількох закодованих символів " .
Марк Амері

І це твердження продовжується, "... що відповідає тому, що користувачі вважають персонажами". Навіть термін " grapheme-joiner ", як і механізм, що стоїть за терміном, є показовим для того, що я заявив на початку своєї відповіді: те, що стандарт Unicode визначає як "символи", насправді є поєднанням графем і символів. Графеми складніше називати "графемами" та символами "символами", а не вигадувати такі контури, як " попередньо складені символи " та " клафери графеми ".
Бідний Йорк

@PoorYorick Ви стверджуєте, що "... персонаж - це окрема одиниця тексту, що складається з однієї або декількох графем" і "Графеми - це окремі маленькі шматочки та шматочки. Персонажі розвиненіші". Чи є у вас якісь посилання, що підтверджують ці претензії? Тому що я якось сумніваюся, що консорціум Unicode навмисно вирішив визначити їхні назви якось "перевернутими".
TS

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