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?
sumber
Jawaban:
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
a
danä
merupakan grapheme, tetapi mereka dapat terdiri dari beberapa titik kode (misalnyaä
mungkin dua titik kode, satu untuk karakter dasara
diikuti 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.sumber
.length
,.codePointAt(0)
,.codePointAt(1)
,.charCodeAt(0)
dan.charCodeAt(1)
hasilnya?a
ditambah "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.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:
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.
sumber