Karakter, kod noktası, glif ve grafik arasındaki fark nedir?


147

Modern Unicode'un inceliklerini anlamaya çalışmak başımı incitiyor. Özellikle, kod noktaları, karakterler, glifler ve grafikemler arasındaki ayrım - en basit durumda, ASCII karakterlerini kullanarak İngilizce metinlerle uğraşırken, hepsinin birbiriyle birebir ilişkisi vardır - bana sorun çıkarır.

Bu terimlerin Matthias Bynens'in JavaScript gibi bir unicode sorunu veya Wikipedia'nın Han birleştirme konusundaki makalesinde nasıl kullanıldığını görünce , bu kavramların aynı şey olmadığını ve bunları karıştırmanın tehlikeli olduğunu topladım, ancak ben her terimin ne anlama geldiğini kavramaya çalışıyor .

Unicode Konsorsiyumu bu konuyu açıklamak için bir sözlük sunar , ancak şu şekilde "tanımlarla" doludur:

Soyut karakter . Metin verilerinin organizasyonu, kontrolü veya temsili için kullanılan bir bilgi birimi. ...

...

Karakter . ... (2) Soyut karakter için eşanlamlı. (3) Unicode karakter kodlaması için temel kodlama birimi. ...

...

Glif . (1) Bir veya daha fazla glif görüntüsünü temsil eden soyut bir form. (2) Glif görüntüsü ile eşanlamlıdır. Unicode karakter verilerini görüntülerken, belirli bir karakteri tasvir etmek için bir veya daha fazla glif seçilebilir.

...

Grafeme . (1) Belirli bir yazı sistemi bağlamında minimal düzeyde farklı bir yazı birimi. ...

Bu tanımların çoğu, çok akademik ve biçimsel görünme kalitesine sahiptir, ancak herhangi bir anlamı anlama kalitesinden yoksundur ya da tanım sorununu, standardın başka bir sözlük girişine veya kısmına erteler.

Bu yüzden I'den daha fazla öğrenilenlerin gizli bilgeliğini arıyorum Bu kavramların her biri birbirinden tam olarak nasıl farklıdır ve hangi koşullarda birbirleriyle bire bir ilişkileri olmazdı?


Birçok farklı dil için çok farklı yazı sistemleri vardır. Dolayısıyla, yazma sorunuyla ilgili farklı görüşler vardır ve arkasında uzun bir tarih vardır. IMHO bunu akılda tutmakta fayda var, çünkü Unicode her şeyi kapsamaya çalışıyor . (El yazısı aynı mı yoksa farklı bir karakter mi? Kanji radikalleri mi? Hangul? Diakritikler? Ten rengi emoji ?? ...)
Pablo H

Yanıtlar:


226
  • Karakter , birçok anlama gelebilecek aşırı yüklenmiş bir terimdir.

  • Bir kod noktası bilgilerinin atom birimidir. Metin bir kod noktası dizisidir. Her kod noktası, Unicode standardı tarafından anlam verilen bir sayıdır.

  • Bir kod birimi , bir depolama birimi bölümü kodlanmış kod noktası. UTF-8'de bu 8 bit, UTF-16'da 16 bit anlamına gelir. Tek bir kod birimi bir tam kod noktasını veya bir kod noktasının bir bölümünü temsil edebilir. Örneğin, kardan adam glifi ( ) tek bir kod noktasıdır ancak 3 UTF-8 kod birimi ve 1 UTF-16 kod birimidir.

  • Bir sesletim bir okuyucu yazı sisteminin tek bir öğe olarak tanıdığı bir tek grafik bir birim olarak gösterildi bir veya daha fazla kod noktalarına bir dizisidir. Örneğin, her ikisi de ave ägrafik öğelerdir, ancak bunlar birden fazla kod noktasından oluşabilir (örneğin ä, biri temel karakter için ve aardından diaresis için bir tane olmak üzere iki kod noktası olabilir ; ancak bu grafiği temsil eden alternatif, eski, tek bir kod noktası da vardır ). Bazı kod noktaları hiçbir zaman herhangi bir grafiğin parçası değildir (örn. Sıfır genişlikli birleşme yeri veya yönlü geçersiz kılmalar).

  • Bir glif genellikle saklanan bir resim, yazı bunların grafemler veya parçalar temsil etmek için kullanılan (glif bir koleksiyon). Yazı tipleri birden çok glifi tek bir gösterimde oluşturabilir, örneğin, yukarıdakiler ätek bir kod noktasıysa, bir yazı tipi bunu iki ayrı, uzamsal olarak üst üste bindirilmiş glif olarak oluşturmayı seçebilir. OTF için, yazı tipinin GSUB ve GPOS tabloları bu işi yapmak için ikame ve konumlandırma bilgileri içerir. Bir yazı tipi, aynı grafik için de birden çok alternatif glif içerebilir.


4
Kod noktası ve kod biriminin sırasını yeniden düzenleyen bir düzenleme gönderdim. Kod biriminin ikinci olması gerektiğine katılıyorum. "Yer dışında" olma konusunda, bu cevabı benden farklı bir amaca hizmet ettiğini gördüğünüzden şüpheleniyorum. Bu terimlerin 5'ini tek bir yerde bulundurmanın büyük bir değeri olduğunu düşünüyorum. İstediğim son şey "glif, grafik, kod birimi ve kod noktası arasındaki fark nedir ve iki yerde cevap almak zorunda." Diğer 4 ile bir tartışma görüyorum ama kod birimi değil
Micah Zoltu

1
Peki örneğin '\ uD83D \ uDC0A' (timsah emojisini gösterir) kod noktaları, grafik kartları vb. Nelerdir? Özellikle, nasıl bir ilişki vardır .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)ve .charCodeAt(1)sonuç?
qbolec

3
@ qbolec: Bunlar, tek bir kod noktasını (U + 1F40A) ifade eden iki UTF-16 kod birimidir ve bir emoji olduğu düşünüldüğünde, muhtemelen kendi tek bir grafiğidir.
Kerrek SB

2
@ TomPažourek: Ayrıştırılmış kanonikleştirmede, iki kod noktasıyla temsil edilir ( aartı "aksanı birleştiren"); bestelenmiş standartlaştırmada tek bir kod noktasıyla ( äeski eski Latin-1 aralığından) temsil edilir . Unicode standartlaştırma, ilginizi çekip çekmediğini araştırmak istediğiniz konudur. Boş sayfalarda, sadece temel ve birleştirici karakterler olur ve önceden oluşturulmuş kompozitler olmazdı.
Kerrek SB

1
@Kaushik: Ne demek istediğinizden emin değilim: bir kod birimi bir depolama birimidir, evet, ancak genel olarak bir kod noktası depolama için birden fazla kod birimi gerektirir (UTF-32 hariç).
Kerrek SB

1

Unicode standardının dışında bir karakter , bir veya daha fazla grafikeminden oluşan tek bir metin birimidir . Unicode standardının "karakter" olarak tanımladığı şey aslında grafik ve karakterlerin bir karışımıdır. Unicode, yan yana dizilmiş grafiklerin tek tek karakterler olarak yorumlanması için kurallar sağlar.

Bir Unicode kod noktası her birine atanan bir numaradır Unicode karakter (karakter veya sesletim ya olan).

Ne yazık ki, Unicode kuralları bazı yan yana grafik grafiklerin zaten kendi kod noktalarına ( önceden oluşturulmuş formlar ) sahip diğer grafikler olarak yorumlanmasına izin verir . Bu, Unicode'da bir karakteri temsil etmenin birden fazla yolu olduğu anlamına gelir. Unicode normalizasyonu bu sorunu giderir.

Glif, bir karakterin görsel temsilidir. Bir yazı tipi, belirli bir karakter kümesi (Unicode karakterler için değil) için bir glif kümesi sağlar. Her karakter için sonsuz sayıda olası glif vardır.

Mark Amery Cevapla

İlk olarak, belirttiğim gibi, her karakter için sonsuz sayıda olası glif vardır, bu nedenle hayır, bir karakter "her zaman tek bir glifle temsil edilmez". Unicode, gliflerle çok fazla ilgilenmez ve kod şemalarında tanımladığı şeyler kesinlikle glif değildir. Sorun, hepsinin de karakter olmaması. Peki ne bunlar?

Daha büyük varlık, grafik veya karakter hangisidir? Metin içindeki harf veya noktalama işareti olmayan grafik öğelerine ne denir? Hızla akla gelen bir terim "grafik" tir. "Bir metindeki grafiksel birim" fikrini kesin olarak ortaya koyan bir kelimedir. Bu tanımı öneririm : Bir grafik, yazılı bir metindeki en küçük belirgin bileşendir .

Biri başka yöne gidebilir ve grafiklerin karakterlerden oluştuğunu söyleyebilir, ancak daha sonra bunlara "Çin grafikleri" ve Çin grafiklerinin oluşturduğu tüm parça ve parçaların yerine "karakterler" denir. Ancak, hepsi geriye dönük. Graphemes belirgin küçük bitler ve parçalar. Karakterler daha gelişmiştir. "Glifler oluşturulabilir" ifadesi, Unicode bağlamında "karakterler oluşturulabilir" olarak daha iyi ifade edilir.

Unicode karakterleri tanımlar ancak diğer grafik veya karakterlerle oluşturulacak grafikemleri de tanımlar. Oluşturduğunuz bu canavarlıklar bunun güzel bir örneğidir. Belki yakalarlarsa Unicode'un sonraki bir sürümünde kendi kod noktalarını alırlar;)

Bütün bunlar için tekrarlayan bir unsur var. Daha yüksek seviyelerde, grafemler karakterler grafem haline gelir, ancak grafemiler tamamen aşağıya iner.

TS'ye Yanıt

Standart durumların 1. Bölümü : "Unicode karakter kodlaması alfabetik karakterleri, ideografik karakterleri ve sembolleri eşit şekilde ele alır, bu da herhangi bir karışımda ve eşit olanaklarla kullanılabileceği anlamına gelir". Bu açıklama göz önüne alındığında, standartta bazı terimlerin bir araya getirilmesine hazırlıklı olmalıyız. Bazen uygun terminoloji, geriye dönük olarak standart geliştikçe netleşir.

Genellikle bir dilin resmi tanımlarında, iki temel şeyin birbirleri açısından tanımlandığı görülür. Örneğin, XML'de bir öğe başlangıç ​​etiketi ve ardından içerik ve ardından bitiş etiketi olarak tanımlanır. İçerik sırayla bir öğe, karakter verisi veya birkaç olası şey olarak tanımlanır. Kendi kendine referans tanımları örüntüsü, Unicode standardında da ima edilmektedir:

Bir grafik kod noktası veya karakterdir.

Bir karakter, bir veya daha fazla grafik aralığından oluşur.

Bu iki tanımla ilk karşılaştığında, okuyucu bir kod noktasının bir karakter olduğu gerekçesiyle ilk tanıma itiraz edebilir , ancak bu her zaman doğru değildir. İki kod noktasından oluşan bir dizi bazen normalleştirme altında tek bir kod noktasını kodlar ve bu kodlanmış kod noktası, şekil 2.7'de gösterildiği gibi karakteri temsil eder . Diğer kod noktalarını kodlayan kod noktalarının dizileri. Bu biraz zorlaşıyor ve kod noktalarını bayt dizilerine kodlamak için UTF-8 gibi karakter kodlama şemalarının kullanıldığı katmana bile ulaşmadık .

Bazı bağlamlarda, örneğin aksanlarla ilgili bir bilimsel makale ve bir karakterin bireysel kısmı metinde tek başına görünebilir. Bu bağlamda, bireysel karakter kısmı bir karakter olarak kabul edilebilir, bu nedenle Unicode standardının da esnek kalması mantıklıdır.

Mark Avery'nin işaret ettiği gibi, bir karakter daha karmaşık bir şey haline getirilebilir. Yani, her karakter istenirse bir grafik görevi görebilir. Tüm kompozisyonun nihai sonucu "kullanıcının bir karakter olarak düşündüğü" bir şeydir. Standartta veya bu tartışmada, en üst düzeyde kullanıcının bireysel karakterler olarak düşündüğü şeylerin olduğu fikrine karşı gerçek bir direnç yok gibi görünüyor. Bu terimi aşırı yüklemekten kaçınmak için, bir karakter oluşturmak için kullanılan parçalara başvurmak istediğimiz tüm durumlarda "grapheme" kullanabiliriz.

Unicode standardı zaman zaman terminolojisi ile her yerde bulunur. Örneğin, Bölüm 3 UTF-8'i "kodlama formu" olarak tanımlarken, sözlükte "kodlama formu" başka bir şey olarak ve UTF-8 "Karakter Kodlama Şeması" olarak tanımlanmaktadır. Başka bir örnek, hatalar olarak kabul edilen , ancak tasfiye edilmesi biraz görev olduğu için devam eden "Grapheme_Base" ve "Grapheme_Extend" dir . Standart tarafından kullanılan terminolojiyi sıkılaştırmak için yapılması gereken çalışmalar vardır.

Grafem Birleştirici eklenmesi önerisi bunun belirtti yanlış zaman got it "grafemler o tekabül kullanıcıların karakter olarak ne düşündüğünü birinden dizileri ya da daha fazla kodlanmış karakterlerdir." Bunun yerine, "Bir veya daha fazla grafikten oluşan bir dizi, kullanıcının bir karakter olarak ne düşündüğünü oluşturur." Daha sonra "grafik dizisi" terimini "karakter dizisi" teriminden farklı olarak kullanabilir. Her iki terim de faydalıdır. "grafik dizisi" düzgün bir şekilde daha küçük parçalardan bir karakter oluşturma işlemini ifade eder. "karakter dizisi", hepimizin bunu kastettiği anlamına gelir: "Kullanıcının karakter olarak düşündüğü şeyler dizisi."

Bazen bir programcı gerçekten grafik dizileri düzeyinde çalışmak istemektedir, bu nedenle bu dizileri incelemek ve manipüle etmek için mekanizmalar mevcut olmalıdır, ancak genellikle metni işlerken "karakter dizileri" (kullanıcının düşündüğü şey) üzerinde çalışmak yeterlidir. karakter olarak) ve sistemin daha alt düzey ayrıntıları yönetmesine izin verin.

Bu tartışmada şu ana kadar ele alınan her durumda, bölünmez bileşenlere atıfta bulunmak için "grafik" ve oluşturulan varlığa atıfta bulunmak için "karakter" kullanmak daha temizdir. Bu kullanım aynı zamanda her iki terimin de köklü anlamlarını daha iyi yansıtır.


Dikkatli bir -1; Ben düşünüyorum bu yanlış. Bir karakterin birçok grafikten oluşabileceğini ima edersiniz, ancak her zaman tek bir glifle temsil edilir; Aslında bunun tam tersi olduğunu düşünüyorum. Gibi sayfalar en.wikipedia.org/wiki/N-diaeresis bir diacritic (anlamını değiştirir en azından bir) ile bir mektup kombinasyonu ayrı yeni Grapheme liman haline geldiğini ve Aksan kendi başına bir sesletim olmadığını düşündürmektedir. Bu arada, glifler açıkça oluşturulabilir s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.̯̖̝̯̟̜̥
Mark Amery

Az önce gördüğüm cevabı takdir ediyorum. Bununla birlikte, hala grafik tanımınızın aslında yanlış olduğunu ya da en azından Unicode'un kelimeyi nasıl tanımladığıyla ilgili olduğunu düşünüyorum. Karakterlerden oluşan bir grafiğin "geriye doğru" olduğu fikrini reddediyorsunuz, ancak biraz kazma yaptım ve tam anlamıyla ifadeyle başlayan unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm buldum " Grafikler, bir veya daha fazla kodlanmış karakterin dizisidir " .
Mark Amery

Ve bu ifade devam ediyor, "... kullanıcıların karakter olarak düşündüklerine karşılık geliyor." Hatta " grapheme-joiner " terimi ve terimin arkasındaki mekanizma bile cevabımın başında belirttiğim şeyi açıklamaktadır: Unicode standardının "karakter" olarak tanımladığı şey aslında bir grafik ve karakter karışımıdır. "Önceden oluşturulmuş karakterler " ve " grafik kümeleri " gibi çarpıtmaları icat etmek yerine, grafik çizimlerini "grafik çizimleri" ve karakter "karakterleri" olarak adlandırmak daha kolaydır .
Zavallı Yorick

@PoorYorick "... bir karakterin, bir veya daha fazla grafikeminden oluşan tek bir metin birimi" ve "Grafikemler, ayrı küçük bitler ve parçalardır. Karakterler daha gelişmiştir" diyorsunuz. Bu iddiaları destekleyen herhangi bir referansınız var mı? Çünkü bir şekilde Unicode konsorsiyumunun isimlerini bir şekilde "tersine çevirme" olarak tanımlamaya karar vermesinden şüphe ediyorum.
TS

@PoorYorick Daha fazla açıklama eklemeden önce ne düşündüğünüzü anladım, bu yüzden sordum. Basitçe referansları istedim (sözlük, bilimsel makaleler, teknik standart, ...), çünkü ben herhangi bir belgeyi bilmiyordum, bunu nasıl yorumladığınız grafeme kullanıyor. (Grapheme için ilk birkaç google sonucu da kelimeyi yolunuzda kullanmaz). Bir blok alıntı eklediniz "Bir grafik bir kod noktası veya bir karakterdir. [...]" - ama nereden geliyor? Sonunda "her iki terimin de köklü anlamları" dersiniz. - Eğer kurulursa, o zaman bir şeye bağlanır, bu terimi bu şekilde kullanır.
TS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.