Jaka jest różnica między znakiem, punktem kodowym, glifem a grafemem?


146

Próba zrozumienia subtelności współczesnego Unicode przyprawia mnie o ból głowy. W szczególności rozróżnienie między punktami kodowymi, znakami, glifami i grafemami - pojęciami, które w najprostszym przypadku, gdy mamy do czynienia z tekstem angielskim używającym znaków ASCII, wszystkie mają ze sobą relację jeden do jednego - sprawia mi kłopot.

Widząc, jak te terminy są używane w dokumentach, takich jak JavaScript Matthiasa Bynensa, ma problem z Unicode lub artykuł Wikipedii na temat unifikacji Han , doszedłem do wniosku, że te pojęcia to nie to samo i że ich łączenie jest niebezpieczne, ale jestem trochę starając się zrozumieć, co oznacza każdy termin .

Konsorcjum Unicode oferuje glosariusz wyjaśniający te kwestie, ale jest on pełen „definicji”, takich jak:

Charakter abstrakcyjny . Jednostka informacji wykorzystywana do organizacji, kontroli lub reprezentacji danych tekstowych. ...

...

Charakter . ... (2) Synonim abstrakcyjnego charakteru. (3) Podstawowa jednostka kodowania dla kodowania znaków Unicode. ...

...

Glif . (1) Abstrakcyjna forma reprezentująca jeden lub więcej obrazów glifów. (2) Synonim obrazu glifów. Przy wyświetlaniu danych znaków Unicode można wybrać jeden lub więcej glifów, aby przedstawiać określony znak.

...

Grafem . (1) Minimalnie wyróżniająca się jednostka pisma w kontekście określonego systemu pisma. ...

Większość z tych definicji ma jakość brzmienia bardzo akademickiego i formalnego, ale brakuje im jakiegokolwiek znaczenia , albo też odkładają problem definicji do jeszcze jednego hasła glosariusza lub sekcji normy.

Dlatego szukam tajemnej mądrości bardziej uczonych niż ja. Czym dokładnie różnią się od siebie te koncepcje i w jakich okolicznościach nie miałyby one ze sobą relacji jeden do jednego?


Istnieje wiele bardzo różnych systemów pisma dla wielu różnych języków. W związku z tym istnieją różne poglądy na problem pisania i kryje się za tym długa historia. IMHO warto o tym pamiętać, ponieważ Unicode stara się objąć wszystko . (Czy kursywą jest ta sama czy inna postać? Rodniki Kanji? Hangul? Znaki diakrytyczne? Emotikony w kolorze skóry? ...)
Pablo H

Odpowiedzi:


225
  • Charakter to przeładowany termin, który może oznaczać wiele rzeczy.

  • Punkt kodowy to atomowa jednostka informacji. Tekst to sekwencja punktów kodowych. Każdy punkt kodowy to liczba, której znaczenie nadaje standard Unicode.

  • Jednostka kodu to jednostka pamięci części zakodowanego punktu kodowego. W UTF-8 oznacza to 8-bitów, w UTF-16 oznacza to 16-bitów. Pojedyncza jednostka kodowa może reprezentować pełny punkt kodowy lub część punktu kodowego. Na przykład snowman glyph ( ) to pojedynczy punkt kodowy, ale 3 jednostki kodu UTF-8 i 1 jednostka kodu UTF-16.

  • Grafem jest sekwencją jednego lub więcej punktów kodowych, które są wyświetlane jako pojedyncze jednostki graficznej, że czytelnik rozpoznaje jako pojedynczy element systemu pisania. Na przykład oba ai äsą grafemami, ale mogą składać się z wielu punktów kodowych (np. äMogą być dwoma punktami kodowymi, jednym dla znaku podstawowego, apo którym następuje diareza; ale istnieje również alternatywny, starszy, pojedynczy punkt kodowy reprezentujący ten grafem ). Niektóre punkty kodowe nigdy nie są częścią żadnego grafemu (np. Brak łączenia o zerowej szerokości lub nadpisania kierunkowe).

  • Glif jest obraz, zwykle przechowywane w czcionki (który jest zbiorem glifĂłw), która służy do reprezentowania grafemy lub jego części. Czcionki mogą składać się z wielu glifów w jedną reprezentację, na przykład jeśli powyższy äpunkt jest pojedynczym punktem kodowym, czcionka może zdecydować się na renderowanie go jako dwóch oddzielnych, nałożonych przestrzennie glifów. W przypadku OTF tabele GSUB i GPOS czcionki zawierają informacje o podstawieniach i pozycjonowaniu, aby to działało. Czcionka może również zawierać wiele alternatywnych glifów dla tego samego grafemu.


4
Właśnie przesłałem edycję zmieniającą kolejność punktów kodowych i jednostek kodowych. Zgadzam się z tobą, że jednostka kodu powinna być na drugim miejscu. Jeśli chodzi o bycie „nie na miejscu”, podejrzewam, że ta odpowiedź ma inny cel niż ja. Myślę, że posiadanie wszystkich 5 tych terminów w jednym miejscu ma wielką wartość. Ostatnią rzeczą, której chcę, jest wyszukanie w Google „jaka jest różnica między glifem, grafemem, jednostką kodu i punktem kodowym i muszę uzyskać odpowiedź w dwóch miejscach. W wielu dyskusjach wszystkie te terminy są używane w dyskusji, rzadko Widzę dyskusję z pozostałymi 4, ale nie kodem.
Micah Zoltu

1
Na przykład '\ uD83D \ uDC0A' (który pokazuje emoji krokodyla), jakie są punkty kodowe, grafemy itp.? W szczególności, jak to się odnosi do .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)i .charCodeAt(1)rezultaty?
qbolec

3
@qbolec: Są to dwie jednostki kodu UTF-16 wyrażające pojedynczy punkt kodowy (U + 1F40A), a biorąc pod uwagę, że jest to emoji, prawdopodobnie jest to własny, pojedynczy grafem.
Kerrek SB,

2
@ TomPažourek: W zdekomponowanej wersji kanonicznej jest reprezentowany przez dwa punkty kodowe ( aplus „łączenie znaków diakrytycznych”); w złożonej wersji kanonicznej jest reprezentowany przez pojedynczy punkt kodowy ( äze starego zakresu Latin-1). Kanonizacja Unicode to temat, który chcesz zbadać, jeśli Cię to interesuje. W świecie z pustymi planszami istniałaby tylko podstawowa i łącząca postać, a nie byłyby gotowe komponenty.
Kerrek SB

1
@Kaushik: Nie jestem pewien, co masz na myśli: jednostka kodu to jednostka pamięci, tak, ale ogólnie punkt kodowy wymaga wielu jednostek kodu do przechowywania (z wyjątkiem UTF-32).
Kerrek SB

1

Poza standardem Unicode znak to indywidualna jednostka tekstu złożona z jednego lub więcej grafemów . To, co standard Unicode definiuje jako „znaki”, jest w rzeczywistości mieszanką grafemów i znaków. Unicode zapewnia reguły interpretacji zestawionych grafemów jako pojedynczych znaków.

Punkt kodowy Unicode to niepowtarzalny numer przypisany do każdego znaku Unicode (który jest znakiem lub grafemem).

Niestety, reguły Unicode pozwalają na interpretację niektórych zestawionych grafemów jako innych grafemów, które mają już własne punkty kodowe ( wstępnie skomponowane formy ). Oznacza to, że w Unicode istnieje więcej niż jeden sposób reprezentowania znaku. Normalizacja Unicode rozwiązuje ten problem.

Glif to wizualna reprezentacja postaci. Czcionka zawiera zestaw glifów dla określonego zestawu znaków (nie znaków Unicode). Dla każdego znaku istnieje nieskończona liczba możliwych glifów.

Odpowiedź dla Marka Amery

Po pierwsze, jak powiedziałem, istnieje nieskończona liczba możliwych glifów dla każdego znaku, więc nie, znak nie jest „zawsze reprezentowany przez jeden glif”. Unicode nie zajmuje się zbytnio glifami, a rzeczy, które definiuje w swoich wykresach kodu z pewnością nie są glifami. Problem w tym, że nie wszystkie są postaciami. Więc czym one są?

Która jest większa, grafem czy postać? Jak można nazwać te elementy graficzne w tekście, które nie są literami ani znakami interpunkcyjnymi? Jednym z terminów, które szybko przychodzą na myśl, jest „grafem”. To słowo, które precyzyjnie wywołuje ideę „jednostki graficznej w tekście”. Podaję następującą definicję: Grafem jest najmniejszym wyrazistym składnikiem w tekście pisanym .

Można by pójść w drugą stronę i powiedzieć, że grafemy składają się ze znaków, ale wtedy nazwałoby się je „grafemami chińskimi”, a wszystkie te fragmenty, z których składają się grafemy chińskie, należałoby zamiast tego nazywać „znakami”. Jednak to wszystko wstecz. Grafemy to wyraźne małe kawałki. Postacie są bardziej rozwinięte. Wyrażenie „glify można komponować” byłoby lepiej sformułowane w kontekście Unicode jako „znaki można komponować”.

Unicode definiuje znaki, ale także definiuje grafemy, które mają być składane z innymi grafemami lub znakami. Te potworności, które skomponowałeś, są tego doskonałym przykładem. Jeśli się złapią, może otrzymają własne punkty kodowe w późniejszej wersji Unicode;)

W tym wszystkim jest element rekurencyjny. Na wyższych poziomach grafemy stają się postaciami, które stają się grafemami, ale są to grafemy aż do dołu.

Odpowiedź do TS

Rozdział 1 standardu stwierdza: „Kodowanie znaków Unicode traktuje znaki alfabetu, znaki ideograficzne i symbole w sposób równoważny, co oznacza, że ​​można ich używać w dowolnej kombinacji iz równą łatwością”. Biorąc pod uwagę to stwierdzenie, powinniśmy być przygotowani na pewne zestawienie terminów w standardzie. Czasami właściwa terminologia staje się jasna dopiero z perspektywy czasu, gdy rozwija się norma.

W formalnych definicjach języka często zdarza się, że dwie podstawowe rzeczy są zdefiniowane względem siebie. Na przykład w XML element jest definiowany jako znacznik początkowy, po którym może następować treść, po której następuje znacznik końcowy. Treść jest z kolei definiowana jako element, dane postaci lub kilka innych możliwych rzeczy. Wzorzec definicji odwołujących się do siebie jest również domniemany w standardzie Unicode:

Grafem to punkt kodowy lub znak.

Znak składa się z sekwencji jednego lub więcej grafemów.

Kiedy po raz pierwszy skonfrontowany z tymi dwiema definicjami, czytelnik może sprzeciwić się pierwszej definicji na tej podstawie, że punkt kodowy jest znakiem, ale nie zawsze jest to prawdą. Sekwencja dwóch punktów kodowych czasami koduje pojedynczy punkt kodowy w trakcie normalizacji , a ten zakodowany punkt kodowy reprezentuje znak, jak pokazano na rysunku 2.7 . Sekwencje punktów kodowych, które kodują inne punkty kodowe. Robi się to trochę skomplikowane i nie dotarliśmy nawet do warstwy, w której schematy kodowania znaków, takie jak UTF-8, są używane do kodowania punktów kodowych w sekwencje bajtów.

W niektórych kontekstach, na przykład artykuł naukowy na temat znaków diakrytycznych , a poszczególne części znaku mogą pojawić się w tekście samodzielnie. W tym kontekście pojedyncza część znaku może być uważana za znak, więc sensowne jest, aby standard Unicode również pozostał elastyczny.

Jak zauważył Mark Avery, postać może zostać złożona w bardziej złożoną rzecz. Oznacza to, że każda postać może w razie potrzeby służyć jako grafem. Końcowy rezultat całej kompozycji to rzecz, o której „użytkownik myśli jak o postaci”. Wydaje się, że nie ma żadnego prawdziwego oporu, ani w standardzie, ani w tej dyskusji, wobec idei, że na najwyższym poziomie są w tekście te rzeczy, o których użytkownik myśli jako o pojedynczych postaciach. Aby uniknąć przeładowania tego terminu, możemy użyć „grafemu” we wszystkich przypadkach, w których chcemy odwołać się do części używanych do tworzenia znaku.

Czasami standard Unicode jest wszędzie ze swoją terminologią. Na przykład, rozdział 3 definiuje UTF-8 jako „formę kodowania”, podczas gdy słownik definiuje „formę kodowania” jako coś innego, a UTF-8 jako „schemat kodowania znaków”. Innym przykładem są „Grapheme_Base” i „Grapheme_Extend”, które są uznawane za błędy, ale utrzymują się, ponieważ ich czyszczenie jest trochę zadaniem. Wciąż pozostaje wiele do zrobienia, aby zaostrzyć terminologię stosowaną w normie.

Wniosek oprócz łączenia grafem Joiner to źle, gdy stwierdził, że „grafemy są sekwencje jednego lub więcej zakodowanych znaków, które odpowiadają co użytkownicy uważają za bohaterów.” Zamiast tego powinno brzmieć: „Sekwencja jednego lub więcej grafemów tworzy to, co użytkownik uważa za znak”. Wtedy mógłby użyć terminu „sekwencja grafemów” w odróżnieniu od terminu „sekwencja znaków”. Oba terminy są przydatne. „Sekwencja grafemów” zgrabnie sugeruje proces tworzenia postaci z mniejszych elementów. „sekwencja znaków” oznacza to, co wszyscy zwykle rozumiemy: „sekwencja rzeczy, o których użytkownik myśli jako znaki”.

Czasami programista naprawdę chce działać na poziomie sekwencji grafemów, więc mechanizmy sprawdzania i manipulowania tymi sekwencjami powinny być dostępne, ale generalnie, podczas przetwarzania tekstu, wystarczy operować na „sekwencjach znaków” (o czym myśli użytkownik jako postać) i pozwól systemowi zarządzać szczegółami niższego poziomu.

W każdym przypadku omawianym do tej pory w tej dyskusji, czystszym jest użycie „grafemu” w odniesieniu do niepodzielnych składników i „charakteru” w odniesieniu do skomponowanej całości. To użycie lepiej odzwierciedla również utrwalone znaczenie obu terminów.


Ostrożny -1; Myślę, że to źle. Sugerujesz, że postać może składać się z wielu grafemów, ale zawsze będzie reprezentowana przez jeden glif; Myślę, że w rzeczywistości jest odwrotnie. Strony takie jak en.wikipedia.org/wiki/N-diaeresis sugerują, że połączenie litery ze znakiem diakrytycznym (przynajmniej takim, który zmienia jego znaczenie) tworzy nowy, wyraźny grafem, a znak diakrytyczny sam w sobie nie jest grafemem. Tymczasem glify są łatwe do komponowania s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.
Mark Amery

Doceniam odpowiedź, którą właśnie zobaczyłem. Jednak nadal uważam, że twoja definicja grafemów jest w rzeczywistości niepoprawna lub przynajmniej sprzeczna z tym, jak Unicode definiuje to słowo. Odrzucasz pomysł, że grafem składa się ze znaków jako „wszystkie od tyłu”, ale poszperałem trochę i znalazłem unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm, które dosłownie zaczyna się od stwierdzenia „ Grafemy to sekwencje jednego lub więcej zakodowanych znaków ” .
Mark Amery

I dalej to stwierdzenie: „... to odpowiada temu, co użytkownicy myślą o postaciach”. Nawet termin „ łącznik grafemowy ”, jak również mechanizm stojący za tym terminem, ilustrują to, co powiedziałem na początku mojej odpowiedzi: To, co standard Unicode definiuje jako „znaki”, jest w rzeczywistości mieszanką grafemów i znaków. Łatwiej jest nazywać grafemy „grafemami” i postaciami „postaciami” zamiast wymyślać wykrzywienia, takie jak „ wstępnie skomponowane znaki ” i „ gromady grafemów ”.
Biedny Yorick

@PoorYorick Twierdzisz, że „... znak to indywidualna jednostka tekstu złożona z jednego lub więcej grafemów” i „Grafemy to odrębne małe fragmenty. Postacie są bardziej rozwinięte”. Czy masz jakieś referencje potwierdzające te twierdzenia? Bo jakoś wątpię, że konsorcjum Unicode celowo zdecydowało się zdefiniować swoje nazwy w jakiś sposób „odwrócone”.
TS

@PoorYorick Zrozumiałem twój punkt widzenia, zanim dodałeś to dalsze wyjaśnienie, nie dlatego zapytałem. Po prostu poprosiłem o referencje (leksykon, artykuły naukowe, norma techniczna, ...), ponieważ nie znałem żadnego dokumentu, który używa grafemu tak, jak go interpretujesz. (Kilka pierwszych wyników wyszukiwania w Google dla grafemu również nie zawiera tego słowa). Dodałeś cytat blokowy „Grafem to punkt kodowy lub znak. […]” - ale skąd on się bierze? Na końcu mówisz „od dawna ustalone znaczenie obu terminów”. - Jeśli jest ustalone, połącz się z czymś, używając tego terminu w ten sposób.
TS
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.