Mengapa "charset" benar-benar berarti "encoding" dalam penggunaan umum?

10

Sesuatu yang telah lama membingungkan saya adalah bahwa begitu banyak perangkat lunak menggunakan istilah "charset" dan "encoding" sebagai sinonim.

Ketika orang merujuk ke "encoding" unicode, mereka selalu berarti seperangkat aturan untuk mewakili karakter unicode sebagai urutan byte - seperti ASCII, atau UTF-8. Ini tampaknya masuk akal dan intuitif; idenya adalah Anda "menyandikan" karakter-karakter itu sebagai byte menggunakan set aturan yang ditentukan.

Karena aturan tersebut terkadang hanya memberikan kemampuan untuk "menyandikan" beberapa subset dari semua karakter unicode, Anda mungkin membayangkan bahwa "charset" - kependekan dari 'set karakter' - hanya akan berarti serangkaian karakter unicode - tanpa memperhatikan bagaimana karakter-karakter tersebut dikodekan. Pengkodean dengan demikian akan menyiratkan charset (pengkodean seperti ASCII, yang hanya memiliki aturan untuk pengkodean 128 karakter, akan dikaitkan dengan charset dari 128 karakter tersebut) tetapi charset tidak perlu menyiratkan pengkodean (misalnya, UTF-8, UTF -16 dan UTF-32 semuanya merupakan penyandian yang berbeda tetapi dapat menyandikan serangkaian karakter yang sama).

Namun - dan inilah inti dari pertanyaan saya - penggunaan kata "charset" di dunia nyata tidak sesuai dengan apa yang disiratkan oleh konstruksi kata itu. Itu hampir selalu digunakan untuk berarti "encoding".

Sebagai contoh:

Berapa umur penggunaan bahasa yang aneh ini, dan bagaimana definisi 'charset' yang kontra-intuitif ini muncul? Apakah itu mungkin berasal dari masa ketika benar - benar ada , dalam praktiknya, pemetaan satu-ke-satu antara pengkodean yang digunakan dan serangkaian karakter yang mereka dukung? Atau adakah beberapa standar atau spesifikasi yang berpengaruh yang menentukan definisi kata ini?

Mark Amery
sumber
5
Penggunaan charsetmendahului standar Unicode, jadi sementara itu mungkin bukan "pemetaan satu-ke-satu", karakter yang diperlukan untuk dokumen cenderung memaksa pilihan pengkodean. Tapi saya tidak punya waktu untuk meneliti sejarah sebenarnya dari kata itu ...
AmeliaBR
2
Anda berbicara tentang set karakter sebagai "set karakter Unicode", seolah-olah seseorang mulai dengan Unicode dan kemudian mengambil himpunan bagian. Lebih akurat untuk mengatakan banyak set karakter ada sebelum penemuan Unicode (atau setidaknya sebelum Unicode menjadi mana-mana), dan Unicode sengaja dibangun untuk menjadi superset dari mereka.
John Bartholomew

Jawaban:

3

Konsep set karakter lebih tua dari Unicode.

Sebelum Unicode, set karakter mendefinisikan set karakter dan bagaimana setiap karakter direpresentasikan sebagai bit. Sebagian besar set karakter memetakan karakter ke byte (yang memungkinkan set 256 karakter), beberapa dipetakan menjadi dua byte, dan beberapa (seperti ASCII) menjadi hanya 7 bit. Rangkaian karakter yang berbeda sering menetapkan nilai yang berbeda untuk karakter yang sama, dan tidak ada kunci terjemahan universal antara berbagai rangkaian karakter yang digunakan.

Unicode adalah upaya untuk memecahkan masalah ini dengan menyatukan semua berbagai set karakter dalam "superset" yang umum. Untuk keperluan ini Unicode memperkenalkan beberapa level abstraksi tambahan, misalnya konsep pengkodean karakter sebagai sesuatu yang terpisah dari nilai-nilai titik kode. Ini memungkinkan Unicode untuk mendefinisikan ulang set karakter pra-unicode sebagai pengkodean karakter unicode.

Atribut charset dalam HTML (yang mencerminkan parameter charset di header tipe konten HTTP) misalnya, berasal dari sebelum unicode diadopsi secara luas, tetapi ketika diputuskan untuk menerima unicode sebagai rangkaian karakter universal internet, atribut charset baru saja didefinisikan ulang untuk menentukan pengkodean yang digunakan, tetapi namanya tidak diubah untuk memungkinkan kompatibilitas ke belakang.

JacquesB
sumber
9

Istilah "charset" tentu saja singkat untuk "set karakter", yang pada gilirannya adalah istilah lama yang digunakan untuk pengkodean karakter, yang dapat diartikan sebagai a) pemetaan antara urutan byte dan karakter, b) pemetaan antara bilangan bulat (nomor kode) dan karakter atau c) pemetaan antara karakter abstrak dan bilangan bulat atau urutan byte.

"Character set" mulai digunakan karena ini adalah ekspresi pendek dan sederhana. Di dalamnya, "set" memiliki makna yang samar-samar (karena seluruh konsepnya samar-samar), tetapi kemudian sering disalahartikan sebagai koleksi ("set" dalam pengertian teoritis set), seperti yang dijelaskan dalam Set Karakter terkenal Dan Connelly (dulu) yang terkenal Dianggap Berbahaya .

Yang paling penting saat itu adalah bahwa pengenal charsetmulai digunakan di MIME dan HTTP. HTTP 1.0 alias RFC 1945 mengutip definisi MIME, “metode yang digunakan dengan satu atau lebih tabel untuk mengubah urutan oktet menjadi urutan karakter” dan kemudian mengomentari kebingungan: “Penggunaan istilah 'set karakter' ini lebih biasa disebut sebagai 'pengkodean karakter.' Namun, karena HTTP dan MIME berbagi registri yang sama, penting bahwa terminologinya juga dibagikan. "

Jukka K. Korpela
sumber
1

RFC2045 memperkenalkan "set karakter" ke MIME dan pada saat itu sudah jelas tidak semua pengkodean memetakan satu karakter ke satu oktet. RFC2130 membahas sejarah ini sedikit lebih banyak.

Pada dasarnya, "charset" adalah istilah yang lebih populer ketika standar-standar itu ditulis, itu lebih ringkas daripada "pengkodean karakter" atau "skema pengkodean teks", dan kurang ambigu daripada "pengkodean".

Steve Clay
sumber
Menurut saya parameter 'charset' sudah ada di RFC 1341 (Juni 1992).
John Bartholomew
1

Setidaknya ada 2 pengkodean yang berlaku untuk transfer teks. Pengkodean karakter menjelaskan bagaimana karakter (mesin terbang) dikodekan. Semua bahasa menggunakan subset dari set karakter UCS, yang sering dikodekan ke nilai 8 bit. Set karakter terstandarisasi memiliki penyandian karakter standar, dan istilah-istilah tersebut pada umumnya digunakan secara bergantian.

Pengkodean transfer menjelaskan bagaimana teks ditransfer dan umumnya tidak tergantung pada pengkodean karakter. Sebagian besar penyandian transfer tidak transparan dan mengubah urutan byte yang ditransfer. Pengkodean transfer 8-bit transparan untuk pengkodean 8-bit. Pengkodean transfer 7-bit hanya dapat mentransfer rangkaian karakter 7-bit seperti ASCII

ASCII menggunakan 95 karakter yang dapat dicetak dan beberapa karakter lainnya untuk kontrol carriage (umpan baris, umpan form, carriage return, backspace, dan tab) yang dikodekan dalam 7 bit. Ada karakter kontrol tambahan menggunakan nilai yang tersisa. ASCII adalah subset yang tepat dari set karakter UCS serta banyak dari set karakter 8 bit. ISO-8859-1 juga merupakan himpunan bagian yang tepat dari rangkaian karakter UCS, tetapi karakter ini memiliki penyandian berbeda di UTF-8, yang menggunakan beberapa byte untuk nilai karakter yang lebih besar dari 127.

Mainframe IBM menggunakan (d) EBCDID yang menggunakan pengkodean 8-bit yang berbeda. Ada tabel terjemahan yang memetakan karakter yang dapat dicetak antara pengkodean karakter ASCII dan ECBDIC. ECBDIC memiliki rangkaian karakter yang lebih besar daripada ASCII karena memiliki tanda baca yang tidak tersedia di ASCII. Ini dapat mencegah transformasi perjalanan pulang-pergi penuh antara kedua pengkodean ini, jika pengkodean awal adalah ECBDIC.

Pengkodean ini tidak cukup untuk bahasa dengan karakter yang tidak tercakup oleh karakter ASCII yang dapat dicetak. Microsoft dan lainnya menggunakan ekstensi 8-bit untuk rangkaian karakter ASCII dan menyandikan karakter tambahan dengan nilai di atas 127. Satu ekstensi tidak cukup untuk semua bahasa karena ekstensi ini hanya menambahkan hingga 96 karakter ke set karakter. Ini menghasilkan beberapa set karakter (rangkaian karakter) yang digunakan untuk bahasa yang berbeda dengan pengkodean karakter 8 bit yang berbeda. Set karakter ini termasuk karakter yang diperlukan untuk bahasa itu atau keluarga bahasa. Karakter tambahan dapat dikodekan ke nilai yang berbeda di rangkaian karakter yang berbeda. Pengguna bahasa Inggris kemungkinan besar akan memperhatikan hal ini dengan tanda baca yang diperluas (tanda kutip kiri dan kanan, dan tanda hubung) yang muncul secara tidak benar jika rangkaian karakter yang salah digunakan.

Untuk penyandian byte tunggal, hanya karakter dalam rangkaian karakter yang dapat disandikan. Beberapa bahasa memerlukan pengkodean multi-byte untuk mencakup rangkaian karakter mereka. Set karakter Unicode (UCS) memerlukan pengkodean multi-byte untuk karakter di luar set karakter ASCII. Set karakter ini adalah superset dari semua pengkodean khusus bahasa. UTF-8 adalah pengkodean ringkas dari rangkaian karakter UCS. ASCII tidak memerlukan byte tambahan, dan sebagian besar (semua?) Karakter bahasa Eropa dapat dikodekan sebagai satu atau dua byte. Set karakter UCS-2 lengkap dapat dikodekan dalam satu hingga tiga byte. Semua karakter dalam rangkaian karakter UCS saat ini dapat dikodekan dalam satu hingga empat byte.

BillThor
sumber
0

FWIW, IIRC, Kembali di Commodore 64 hari, set karakter adalah fungsi dari {0, ... 255} ke set semua gambar uxv hitam dan putih di mana u dan v mungkin 8 dan 12. Jadi, "ubah Anda set karakter "berarti menggunakan perintah POKE dalam bahasa BASIC untuk memodifikasi lokasi memori yang ditunjuk untuk menyimpan gambar-gambar itu. Misalnya kode ASCII 65 berarti A dan gambar A akan disimpan mulai dari alamat memori a * 65 + b untuk beberapa b dan saya kira a = u * v.

Bjørn Kjos-Hanssen
sumber