Apa perbedaan antara karakter, titik kode, mesin terbang dan grapheme?

146

Mencoba memahami seluk-beluk Unicode modern membuat kepalaku sakit. Secara khusus, perbedaan antara titik kode, karakter, mesin terbang dan grapheme - konsep yang dalam kasus paling sederhana , ketika berhadapan dengan teks bahasa Inggris menggunakan karakter ASCII, semua memiliki hubungan satu-ke-satu dengan satu sama lain - yang menyebabkan saya kesulitan.

Melihat bagaimana istilah-istilah ini digunakan dalam dokumen-dokumen seperti JavaScript Matthias Bynens ' memiliki masalah unicode atau tulisan Wikipedia tentang penyatuan Han , saya telah mengumpulkan bahwa konsep-konsep ini bukan hal yang sama dan bahwa berbahaya untuk menerjemahkannya, tetapi saya agak berjuang untuk memahami apa setiap istilah berarti .

The Unicode Consortium menawarkan glosarium untuk menjelaskan hal ini, tetapi penuh dengan "definisi" seperti ini:

Karakter Abstrak . Unit informasi yang digunakan untuk organisasi, kontrol, atau representasi data tekstual. ...

...

Karakter . ... (2) Sinonim untuk karakter abstrak. (3) Unit dasar pengkodean untuk pengkodean karakter Unicode. ...

...

Mesin terbang . (1) Bentuk abstrak yang mewakili satu atau lebih gambar mesin terbang. (2) Sinonim untuk gambar mesin terbang. Dalam menampilkan data karakter Unicode, satu atau lebih mesin terbang dapat dipilih untuk menggambarkan karakter tertentu.

...

Grapheme . (1) Unit penulisan minimal yang berbeda dalam konteks sistem penulisan tertentu. ...

Sebagian besar definisi ini memiliki kualitas terdengar sangat akademis dan formal, tetapi tidak memiliki kualitas makna apa pun , atau menunda masalah definisi untuk entri glosarium lain atau bagian standar.

Jadi saya mencari kebijaksanaan misterius dari mereka yang lebih terpelajar daripada saya. Bagaimana tepatnya masing-masing konsep ini berbeda satu sama lain, dan dalam keadaan apa mereka tidak akan memiliki hubungan satu-ke-satu dengan yang lain?

Mark Amery
sumber
Ada banyak sistem penulisan yang sangat berbeda, untuk banyak bahasa yang berbeda. Jadi ada berbagai pandangan tentang masalah penulisan, dan ada juga sejarah panjang di baliknya. IMHO itu berguna untuk diingat, karena Unicode mencoba untuk menutupi semuanya . (Apakah karakter kursif sama atau berbeda? Radikal Kanji? Hangul? Diakritik? Emoji berwarna kulit ?? ...)
Pablo H

Jawaban:

225
  • Karakter adalah istilah yang kelebihan beban daripada yang bisa berarti banyak hal.

  • Sebuah titik kode adalah unit atom informasi. Teks adalah urutan titik kode. Setiap titik kode adalah angka yang diberi makna oleh standar Unicode.

  • Sebuah kode unit adalah unit penyimpanan dari bagian dari sebuah titik kode encoded. Dalam UTF-8 ini berarti 8-bit, dalam UTF-16 ini berarti 16-bit. Unit kode tunggal dapat mewakili titik kode lengkap, atau bagian dari titik kode. Sebagai contoh, mesin terbang salju ( ) adalah titik kode tunggal tetapi 3 unit kode UTF-8, dan 1 unit kode UTF-16.

  • Sebuah grafem adalah urutan satu atau lebih poin kode yang ditampilkan sebagai unit grafis tunggal yang pembaca mengakui sebagai satu elemen dari sistem tulisan. Sebagai contoh, keduanya adan ämerupakan grapheme, tetapi mereka dapat terdiri dari beberapa titik kode (misalnya ämungkin dua titik kode, satu untuk karakter dasar adiikuti oleh satu untuk diaresis; tetapi ada juga alternatif, warisan, titik kode tunggal yang mewakili grafem ini) ). Beberapa titik kode tidak pernah menjadi bagian dari grapheme apa pun (mis. Lebar-nol non-joiner, atau pengesampingan arah).

  • Sebuah mesin terbang adalah gambar, biasanya disimpan dalam huruf (yang merupakan kumpulan dari mesin terbang), digunakan untuk mewakili grafem atau bagiannya. Font dapat menyusun beberapa mesin terbang menjadi satu representasi, misalnya, jika di atas äadalah titik kode tunggal, sebuah font dapat memilih untuk membuat itu sebagai dua mesin terbang terpisah, yang ditata secara spasial. Untuk OTF, tabel font GSUB dan GPOS font berisi informasi pengganti dan pemosisian untuk membuatnya berfungsi. Sebuah font dapat berisi beberapa mesin terbang alternatif untuk grapheme yang sama juga.

Kerrek SB
sumber
4
Saya baru saja mengirimkan suntingan yang mengatur ulang urutan kode-titik dan kode-unit. Saya setuju dengan Anda bahwa unit kode harus berada di urutan kedua. Mengenai "tidak pada tempatnya", saya kira Anda melihat jawaban ini melayani tujuan yang berbeda dari yang saya lakukan. Saya pikir ada nilai besar dalam memiliki semua 5 istilah ini di satu tempat. Hal terakhir yang saya inginkan adalah google untuk "apa perbedaan antara mesin terbang, grapheme, unit kode dan titik kode dan harus mendapatkan jawabannya di dua tempat. Dalam banyak diskusi istilah ini semuanya digunakan dalam diskusi, jarang dilakukan Saya melihat diskusi dengan 4 yang lain tetapi bukan unit kode
Micah Zoltu
1
Jadi misalnya '\ uD83D \ uDC0A' (yang menunjukkan emoji buaya) apa poin kode, graphem, dll? Secara khusus, bagaimana cara berhubungan dengan .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)dan .charCodeAt(1)hasilnya?
qbolec
3
@ qbolec: Itu adalah dua unit kode UTF-16 yang mengekspresikan titik kode tunggal (U + 1F40A), dan mengingat bahwa itu adalah emoji, itu mungkin merupakan grafeme tunggal.
Kerrek SB
2
@ TomPažourek: Dalam kanonikisasi terurai, itu diwakili oleh dua codepoint ( aditambah "menggabungkan diakritik"); dalam kanonikisasi tersusun diwakili oleh satu codepoint tunggal ( ädari warisan Latin-1 lama) Kanonik Unicode adalah subjek yang ingin Anda selidiki jika ini menarik minat Anda. Dalam dunia batu tulis kosong, hanya akan ada basis dan menggabungkan karakter dan tidak ada komposit prebuilt.
Kerrek SB
1
@ Kaushik: Saya tidak yakin apa yang Anda maksud: unit kode adalah unit penyimpanan, ya, tetapi titik kode secara umum membutuhkan beberapa unit kode untuk penyimpanan (kecuali dalam UTF-32).
Kerrek SB
1

Di luar standar Unicode karakter adalah unit teks individual yang terdiri dari satu atau lebih grapheme . Apa yang didefinisikan oleh standar Unicode sebagai "karakter" sebenarnya adalah campuran dari grafem dan karakter. Unicode memberikan aturan untuk interpretasi grapheme yang disandingkan sebagai karakter individu.

Sebuah Unicode titik kode adalah nomor unik yang ditugaskan untuk setiap karakter Unicode (yang baik karakter atau grafem a).

Sayangnya, aturan Unicode memungkinkan beberapa grapheme disandingkan diinterpretasikan sebagai grapheme lain yang sudah memiliki poin kode mereka sendiri ( formulir precomposed ). Ini berarti bahwa ada lebih dari satu cara di Unicode untuk mewakili karakter. Normalisasi Unicode mengatasi masalah ini.

Mesin terbang adalah representasi visual dari suatu karakter. Font menyediakan seperangkat mesin terbang untuk serangkaian karakter tertentu (bukan karakter Unicode). Untuk setiap karakter, ada jumlah mesin terbang yang mungkin tak terbatas.

Balas ke Mark Amery

Pertama, seperti yang saya nyatakan, ada jumlah mesin terbang yang mungkin tak terbatas untuk setiap karakter jadi tidak, karakter tidak "selalu diwakili oleh mesin terbang tunggal". Unicode tidak terlalu mementingkan dirinya sendiri dengan mesin terbang, dan hal-hal yang didefinisikannya dalam diagram kodenya tentu bukan mesin terbang. Masalahnya adalah keduanya bukan karakter. Jadi apa mereka

Mana entitas yang lebih besar, grapheme atau karakter? Apa yang disebut elemen-elemen grafik dalam teks yang bukan huruf atau tanda baca? Satu istilah yang muncul dengan cepat di pikiran adalah "grapheme". Ini adalah kata yang secara tepat memunculkan ide "unit grafis dalam teks". Saya menawarkan definisi ini: Grapheme adalah komponen berbeda terkecil dalam teks tertulis .

Seseorang dapat pergi ke arah lain dan mengatakan bahwa grafem terdiri dari karakter, tetapi kemudian mereka akan disebut "grafem Cina", dan semua potongan-potongan grafem Cina terdiri dari harus disebut "karakter" sebagai gantinya. Namun, itu semua mundur. Graphem adalah bagian-bagian kecil yang berbeda. Karakter lebih berkembang. Ungkapan "mesin terbang adalah komposer", akan lebih baik dinyatakan dalam konteks Unicode sebagai "karakter komposer".

Unicode mendefinisikan karakter tetapi juga mendefinisikan grapheme yang akan disusun dengan grapheme atau karakter lain. Monstrositas yang Anda buat adalah contoh yang bagus untuk ini. Jika mereka mengetahui, mungkin mereka akan mendapatkan poin kode mereka sendiri di versi Unicode yang lebih baru;)

Ada elemen rekursif untuk semua ini. Pada level yang lebih tinggi, grafem menjadi karakter menjadi grafem, tetapi grafeminya sepenuhnya turun.

A Reply to TS

Bab 1 dari standar menyatakan: "Pengodean karakter Unicode memperlakukan karakter alfabet, karakter ideografis, dan simbol secara setara, yang berarti mereka dapat digunakan dalam campuran apa pun dan dengan fasilitas yang sama". Mengingat pernyataan ini, kita harus siap untuk beberapa penggabungan istilah dalam standar. Terkadang terminologi yang tepat hanya menjadi jelas dalam retrospeksi ketika standar berkembang.

Sering terjadi dalam definisi formal bahasa bahwa dua hal mendasar didefinisikan dalam hal satu sama lain. Misalnya, dalam XML elemen didefinisikan sebagai tag awal yang mungkin diikuti oleh konten, diikuti oleh tag akhir. Konten didefinisikan pada gilirannya sebagai elemen, data karakter, atau beberapa hal lain yang mungkin. Pola definisi referensial diri juga tersirat dalam standar Unicode:

Grapheme adalah titik kode atau karakter.

Karakter terdiri dari urutan satu atau lebih grapheme

Ketika pertama kali dihadapkan dengan dua definisi ini pembaca mungkin keberatan dengan definisi pertama dengan alasan bahwa titik kode adalah karakter, tetapi itu tidak selalu benar. Urutan dua titik kode kadang-kadang mengkodekan satu titik kode di bawah normalisasi , dan titik kode yang disandikan itu mewakili karakter, seperti yang diilustrasikan dalam Gambar 2.7 . Urutan titik kode yang menyandikan titik kode lainnya. Ini menjadi sedikit rumit dan kami bahkan belum mencapai lapisan di mana skema pengkodean karakter seperti UTF-8 digunakan untuk menyandikan poin kode ke urutan byte.

Dalam beberapa konteks, misalnya artikel ilmiah tentang diakritik , dan bagian individu dari karakter mungkin muncul dalam teks dengan sendirinya. Dalam konteks itu, bagian karakter individu dapat dianggap sebagai karakter, sehingga masuk akal bahwa standar Unicode tetap fleksibel juga.

Seperti yang ditunjukkan Mark Avery, karakter dapat dikomposisikan menjadi hal yang lebih kompleks. Artinya, setiap karakter dapat berfungsi sebagai grapheme jika diinginkan. Hasil akhir dari semua komposisi adalah hal yang "dianggap pengguna sebagai karakter". Tampaknya tidak ada perlawanan nyata, baik dalam standar atau dalam diskusi ini, dengan gagasan bahwa pada level tertinggi ada hal-hal ini dalam teks yang pengguna anggap sebagai karakter individu. Untuk menghindari kelebihan istilah itu, kita dapat menggunakan "grapheme" dalam semua kasus di mana kita ingin merujuk ke bagian yang digunakan untuk menulis karakter.

Terkadang standar Unicode ada di mana-mana dengan terminologinya. Sebagai contoh, Bab 3 mendefinisikan UTF-8 sebagai "bentuk penyandian" sedangkan glosarium mendefinisikan "bentuk penyandian" sebagai sesuatu yang lain, dan UTF-8 sebagai "Skema Pengodean Karakter". Contoh lain adalah "Grapheme_Base" dan "Grapheme_Extend", yang diakui sebagai kesalahan tetapi itu tetap ada karena membersihkannya adalah sedikit tugas. Masih ada pekerjaan yang harus dilakukan untuk memperketat terminologi yang digunakan oleh standar.

The Proposal untuk penambahan PENGGABUNGAN Grafem punya salah ketika menyatakan bahwa "grafem adalah urutan satu atau lebih karakter dikodekan yang sesuai dengan apa yang pengguna berpikir sebagai karakter." Seharusnya membaca, "Urutan satu atau lebih grapheme menyusun apa yang pengguna anggap sebagai karakter." Kemudian ia dapat menggunakan istilah "urutan grafik" secara jelas dari istilah "urutan karakter". Kedua istilah itu bermanfaat. "Urutan grapheme" dengan rapi menyiratkan proses membangun karakter dari potongan yang lebih kecil. "urutan karakter" berarti apa yang secara khas kita semua maksud sebagai: "Urutan hal-hal yang pengguna pikirkan sebagai karakter."

Kadang-kadang seorang programmer benar-benar ingin beroperasi pada tingkat urutan grapheme, sehingga mekanisme untuk memeriksa dan memanipulasi urutan tersebut harus tersedia, tetapi secara umum, ketika memproses teks, itu cukup untuk beroperasi pada "urutan karakter" (apa yang dipikirkan pengguna tentang sebagai karakter) dan biarkan sistem mengelola detail level bawah.

Dalam setiap kasus yang dibahas sejauh ini dalam diskusi ini, lebih baik menggunakan "grapheme" untuk merujuk pada komponen dan "karakter" yang tidak dapat dibagi untuk merujuk ke entitas yang dikomposisikan. Penggunaan ini juga lebih mencerminkan makna yang telah lama ada dari kedua istilah tersebut.

Kasihan Yorick
sumber
-1 yang berhati-hati; Saya pikir ini salah. Anda menyiratkan bahwa karakter dapat terdiri dari banyak grapheme, tetapi akan selalu diwakili oleh mesin terbang tunggal; Saya pikir sebenarnya itu sebaliknya. Halaman-halaman seperti en.wikipedia.org/wiki/N-diaeresis menyarankan bahwa kombinasi huruf dengan diakritik (setidaknya yang mengubah maknanya) membentuk grapheme baru yang berbeda, dan bahwa diacritic bukanlah grafem sendiri. Sementara itu, mesin terbang jelas terdiri dari s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.̯̖̝̯̟̜̥
Mark Amery
Saya menghargai balasannya, yang baru saja saya lihat. Namun, saya masih berpikir bahwa definisi Anda tentang grapheme sebenarnya tidak benar, atau setidaknya bertentangan dengan bagaimana Unicode mendefinisikan kata tersebut. Anda menolak gagasan tentang grafem yang terdiri dari karakter sebagai "semuanya mundur", tetapi saya melakukan sedikit penggalian dan menemukan unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm yang secara harfiah dimulai dengan pernyataan " Graphem adalah urutan dari satu atau lebih karakter yang disandikan " .
Mark Amery
Dan pernyataan itu berlanjut, "... yang sesuai dengan apa yang dipikirkan pengguna sebagai karakter." Bahkan istilah " grapheme-joiner ", serta mekanisme di balik istilah itu, adalah ilustrasi dari apa yang saya nyatakan di awal jawaban saya: Apa yang didefinisikan oleh standar Unicode sebagai "karakter" sebenarnya adalah campuran dari grafem dan karakter. Lebih bersih untuk memanggil grapheme "grapheme" dan karakter "karakter" daripada menciptakan contortions seperti " karakter yang dikomposisi sebelumnya " dan " cluster grapheme ".
Kasihan Yorick
@ Pattyorick Anda mengklaim, bahwa "... sebuah karakter adalah unit teks individual yang terdiri dari satu atau lebih grapheme" dan "Grapheme adalah bagian-bagian kecil yang berbeda. Karakter lebih dikembangkan". Apakah Anda memiliki referensi yang mendukung klaim ini? Karena entah bagaimana saya ragu, bahwa konsorsium Unicode sengaja memutuskan untuk mendefinisikan nama mereka entah bagaimana "terbalik".
TS
@ Pattyorick Saya mengerti maksud Anda, sebelum Anda menambahkan penjelasan lebih lanjut ini, itu bukan alasan saya bertanya. Saya hanya meminta referensi (leksikon, artikel ilmiah, standar teknis, ...), karena saya tidak tahu dokumen apa pun, yang menggunakan grapheme seperti cara Anda menafsirkannya. (Beberapa hasil google pertama untuk grapheme juga tidak menggunakan kata di jalan Anda). Anda menambahkan blockquote "Grapheme adalah titik kode atau karakter. [...]" - tetapi dari mana asalnya? Pada akhirnya Anda mengatakan "makna lama dari kedua istilah." - Jika sudah mapan maka tautan ke sesuatu, itu menggunakan istilah seperti ini.
TS