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?
źródło
Odpowiedzi:
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
a
iä
są grafemami, ale mogą składać się z wielu punktów kodowych (np.ä
Mogą być dwoma punktami kodowymi, jednym dla znaku podstawowego,a
po 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.źródło
.length
,.codePointAt(0)
,.codePointAt(1)
,.charCodeAt(0)
i.charCodeAt(1)
rezultaty?a
plus „łą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.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:
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.
źródło