Apa perbedaan antara pengodean dan charset?

151

Saya bingung tentang pengodean teks dan charset. Untuk banyak alasan, saya harus belajar hal-hal non-Unicode, non-UTF8 dalam pekerjaan saya yang akan datang.

Saya menemukan kata "charset" di header email seperti pada "ISO-2022-JP", tetapi tidak ada pengkodean dalam editor teks. (Saya melihat-lihat editor teks yang berbeda.)

Apa perbedaan antara pengodean teks dan charset? Saya akan menghargai jika Anda bisa menunjukkan kepada saya beberapa contoh kasus penggunaan.

TK.
sumber
Lihat posting ini: stackoverflow.com/questions/13743250/…
rghome

Jawaban:

144

Pada dasarnya:

  1. charset adalah serangkaian karakter yang dapat Anda gunakan
  2. Pengodean adalah cara karakter-karakter ini disimpan ke dalam memori
Svetlozar Angelov
sumber
42
Benar, tetapi dalam pelaksanaannya "charset" biasanya mengacu baik repertoar karakter dan skema pengkodean.
Alan Moore
@AlanMoore Memang, hampir sama dengan cara orang mengatakan "angka desimal" untuk merujuk ke nomor apa pun dengan "pemisah desimal". Itu tidak benar, tetapi ya Anda harus sadar bahwa beberapa orang menggunakannya seperti itu.
bvdb
2
Itu tidak sepenuhnya benar. Sebagai contoh, Unicode mengacu pada set karakter, tetapi ada beberapa kemungkinan penyandian (UTF-8, UTF-16, UTF-32).
rghome
84

Setiap penyandian memiliki charset tertentu yang terkait dengannya, tetapi mungkin ada lebih dari satu penyandian untuk charset yang diberikan. Charset hanyalah seperti apa itu, seperangkat karakter. Ada sejumlah besar rangkaian karakter, termasuk banyak yang ditujukan untuk skrip atau bahasa tertentu.

Namun, kami berjalan dengan baik dalam transisi ke Unicode, yang mencakup serangkaian karakter yang mampu mewakili hampir semua skrip dunia. Namun, ada beberapa penyandian untuk Unicode. Pengkodean adalah cara memetakan string karakter ke string byte. Contoh pengkodean Unicode termasuk UTF-8 , UTF-16 BE , dan UTF-16 LE . Masing-masing memiliki keunggulan untuk aplikasi atau arsitektur mesin tertentu.

Matthew Flaschen
sumber
20
Perhatikan bahwa javadoc secara keliru menggunakan "charset" alih-alih "encoding", misalnya di InputStreamReader , kita membaca "InputStreamReader adalah jembatan dari stream byte ke stream karakter: Ia membaca byte dan mendekodekannya menjadi karakter menggunakan charset yang ditentukan. penggunaannya dapat ditentukan dengan nama atau dapat diberikan secara eksplisit, atau rangkaian karakter default platform dapat diterima. " . Namun, yang mereka maksud adalah "encoding".
David Tonhofer
4
Terima kasih atas penjelasan Anda. Unicode adalah rangkaian karakter, dan UTF-8 adalah salah satu cara penyandian Unicode , dan UTF-16 adalah cara penyandian lain dari Unicode .
HongchaoZhang
47

Selain jawaban lain saya pikir artikel ini adalah bacaan yang baik http://www.joelonsoftware.com/articles/Unicode.html

Artikel itu berjudul " Minimum Yang Mutlak Setiap Pengembang Perangkat Lunak Sepenuhnya, Pasti Harus Tahu Tentang Unicode dan Set Karakter (Tanpa Alasan!) " Yang ditulis oleh Joel Spolsky . Esai ini sudah lebih dari 10 tahun, tetapi (sayangnya) isinya masih valid ...

mattanja
sumber
2
Terima kasih banyak untuk memperkenalkan artikel ini. Ini adalah salah satu yang baik.
TK.
9
Jawaban ini dapat ditingkatkan dengan memberikan penjelasan singkat tentang mengapa saya harus membaca artikel Joel.
james.garriss
@mattanja Tautan yang Anda berikan benar-benar hebat. Terima kasih telah berbagi. Terpilih.
hagrawal
1
Saya juga ingin meletakkan artikel yang bagus ini yang agak lampiran untuk Joel Spolsky; kunststube.net/encoding
mkb
Saya tidak mengerti artikel Joel pada bacaan pertama saya. Sebaliknya saya menemukan powerpoint ini menjadi lebih jelas dan spesifik: unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer
27

Pengkodean karakter terdiri dari:

  1. Himpunan karakter yang didukung
  2. Pemetaan antara karakter dan bilangan bulat ("titik kode")
  3. Bagaimana poin kode dikodekan sebagai serangkaian "unit kode" (misalnya, unit 16-bit untuk UTF-16)
  4. Bagaimana unit kode dikodekan ke dalam byte (misalnya, big-endian atau little-endian)

Langkah # 1 dengan sendirinya adalah "repertoar karakter" atau abstrak "set karakter", dan # 1 + # 2 = a "set karakter kode".

Tetapi kembali sebelum Unicode menjadi populer dan semua orang (kecuali orang Asia Timur) menggunakan pengodean byte tunggal, langkah # 3 dan # 4 adalah sepele (titik kode = kode unit = byte). Jadi, protokol yang lebih lama tidak dengan jelas membedakan antara "pengkodean karakter" dan "kumpulan karakter yang dikodekan". Protokol yang lebih lama digunakan charsetketika mereka benar-benar berarti penyandian.

dan04
sumber
apakah itu sebabnya kita bisa membaca charset = 'utf-8' di tag html META? karena sudah lama didefinisikan
Eildosa
26

Melemparkan lebih banyak cahaya untuk orang yang mengunjungi selanjutnya, semoga akan membantu.


Set karakter

Ada karakter dalam setiap bahasa dan kumpulan karakter-karakter tersebut membentuk "set karakter" dari bahasa itu. Ketika karakter dikodekan maka itu diberikan pengidentifikasi unik atau nomor yang disebut sebagai titik kode. Di komputer, titik kode ini akan diwakili oleh satu atau lebih byte.

Contoh set karakter: ASCII (mencakup semua karakter bahasa Inggris), ISO / IEC 646, Unicode (mencakup karakter dari semua bahasa yang hidup di dunia)

Set Karakter Kode

Set karakter kode adalah set di mana nomor unik ditugaskan untuk setiap karakter. Angka unik itu disebut "titik kode".
Set karakter kode kadang-kadang disebut halaman kode.

Pengkodean

Pengkodean adalah mekanisme untuk memetakan titik-titik kode dengan beberapa byte sehingga karakter dapat dibaca dan ditulis secara seragam di seluruh sistem yang berbeda menggunakan skema pengkodean yang sama.

Contoh pengkodean: ASCII, skema pengkodean Unicode seperti UTF-8, UTF-16, UTF-32.

Elaborasi 3 konsep di atas

  • Pertimbangkan ini - Karakter 'क' dalam set karakter Devanagari memiliki titik kode desimal 2325 yang akan diwakili oleh dua byte ( 09 15) ketika menggunakan pengkodean UTF-16
  • Dalam "ISO-8859-1" skema pengkodean "ü" (ini tidak lain adalah karakter dalam set karakter Latin) direpresentasikan sebagai nilai heksa-desimal FCsementara di "UTF-8" itu diwakili sebagai C3 BCdan di UTF-16 sebagai FE FF 00 FC.
  • Skema penyandian yang berbeda dapat menggunakan titik kode yang sama untuk mewakili karakter yang berbeda, misalnya dalam "ISO-8859-1" (juga disebut sebagai Latin1) nilai titik kode desimal untuk huruf 'é' adalah 233. Namun, dalam ISO 8859-5 , titik kode yang sama mewakili karakter Sirilik 'щ'.
  • Di sisi lain, satu titik kode dalam set karakter Unicode sebenarnya dapat dipetakan ke urutan byte yang berbeda, tergantung pada pengkodean mana yang digunakan untuk dokumen. Karakter Devanagari क, dengan titik kode 2325 (yang merupakan notasi heksadesimal 915), akan diwakili oleh dua byte saat menggunakan pengkodean UTF-16 ( 09 15), tiga byte dengan UTF-8 ( E0 A4 95), atau empat byte dengan UTF-32 ( 00 00 09 15)
hagrawal
sumber
11

Set karakter, atau repertoar karakter, hanyalah set (koleksi yang tidak diurut) dari karakter. Set karakter kode memberikan integer ("titik kode") ke setiap karakter dalam repertoar. Pengkodean adalah cara untuk menunjukkan titik kode secara jelas sebagai aliran byte.

Jonathan Feinberg
sumber
Ini harus menjadi jawaban yang diterima. Itu jelas mendefinisikan tiga konsep: set karakter, set karakter kode, dan pengkodean.
Marcus Junius Brutus
6

Dicari untuk itu. http://en.wikipedia.org/wiki/Character_encoding

Perbedaannya tampaknya halus. Istilah charset sebenarnya tidak berlaku untuk Unicode. Unicode melewati serangkaian abstraksi. karakter abstrak -> titik kode -> penyandian poin kode ke byte.

Charset sebenarnya melewatkan ini dan langsung melompat dari karakter ke byte. urutan byte <-> urutan karakter

Singkatnya, pengodean: titik kode -> byte charset: karakter -> byte

Fakrudeen
sumber
5

Charset hanyalah seperangkat; itu mengandung, misalnya tanda Euro, atau yang lain tidak. Itu saja.

Pengkodean adalah pemetaan bijective dari set karakter ke set bilangan bulat. Jika mendukung tanda Euro, itu harus menetapkan bilangan bulat spesifik untuk karakter itu dan tidak ke yang lain.

Kilian Foth
sumber
Apakah itu harus bijektif?
Jörg W Mittag
2
Pengkodean dan penguraian harus bersifat deterministik, jadi tidak mungkin ada pemetaan yang ambigu. Saya kira Anda bisa memiliki satu set bilangan bulat yang tidak berdekatan sebagai kodomain, tetapi itu akan membuang-buang ruang saat Anda menyimpan teks, dan para insinyur benci ruang kosong.
Kilian Foth
1
Pengkodean karakter lama seringkali tidak bijektif. Misalnya, dalam IBM437, baik ß dan β diwakili oleh 0xE1.
dan04
3

Menurut pendapat saya, charset adalah bagian dari pengkodean (komponen), pengkodean memiliki atribut charset, sehingga charset dapat digunakan dalam banyak pengkodean. Misalnya unicode adalah charset yang digunakan dalam pengkodean seperti UTF-8, UTF-16 dan sebagainya. Lihat ilustrasi di sini:Lihat ilustrasi di sini

Char di charset tidak berarti tipe char di dunia pemrograman, itu berarti char di dunia nyata, dalam bahasa Inggris itu mungkin sama, tetapi dalam bahasa lain tidak, seperti bahasa Cina, '我' adalah 'char' yang tidak terpisahkan dalam charsets (UNICODE, GB [digunakan dalam GBK dan GB2312]), 'a' juga merupakan char in charset (ASCII, ISO-8859 , UNICODE).

Eric Liu
sumber
1

Menurut pendapat saya, kata "charset" harus dibatasi untuk mengidentifikasi parameter yang digunakan dalam HTTP, MIME, dan standar serupa untuk menentukan pengkodean karakter (pemetaan dari serangkaian karakter teks ke urutan byte) dengan nama. Sebagai contoh:charset=utf-8 .

Saya menyadari, bagaimanapun, bahwa MySQL, Java, dan tempat-tempat lain dapat menggunakan kata "charset" yang berarti pengkodean karakter.

Peter O.
sumber
1

Pengkodean adalah pemetaan antara byte dan karakter dari set karakter, jadi akan sangat membantu untuk mendiskusikan dan memahami perbedaan antara byte dan karakter .

Pikirkan byte sebagai angka antara 0 dan 255, sedangkan karakter adalah hal-hal abstrak seperti "a", "1", "$" dan "Ä". Set semua karakter yang tersedia disebut set karakter .

Setiap karakter memiliki urutan satu atau lebih byte yang digunakan untuk merepresentasikannya; Namun, jumlah dan nilai byte yang tepat tergantung pada pengkodean yang digunakan dan ada banyak pengkodean yang berbeda.

Sebagian besar pengkodean didasarkan pada set karakter lama dan pengkodean yang disebut ASCII yang merupakan byte tunggal per karakter (sebenarnya, hanya 7 bit) dan berisi 128 karakter termasuk banyak karakter umum yang digunakan dalam bahasa Inggris AS.

Misalnya, berikut adalah 6 karakter dalam set karakter ASCII yang diwakili oleh nilai 60 hingga 65.

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64  ║      @       ║
║  65  ║      A       ║
╚══════╩══════════════╝

Dalam set ASCII lengkap, nilai terendah yang digunakan adalah nol dan tertinggi 127 (keduanya adalah karakter kontrol tersembunyi).

Namun, begitu Anda mulai membutuhkan lebih banyak karakter daripada yang disediakan ASCII dasar (misalnya, huruf dengan aksen, simbol mata uang, simbol grafik, dll.), ASCII tidak cocok dan Anda membutuhkan sesuatu yang lebih luas. Anda memerlukan lebih banyak karakter (kumpulan karakter yang berbeda) dan Anda memerlukan pengodean yang berbeda karena 128 karakter tidak cukup untuk memuat semua karakter. Beberapa pengkodean menawarkan satu byte (256 karakter) atau hingga enam byte.

Seiring waktu, banyak penyandian telah dibuat. Di dunia Windows, ada CP1252, atau ISO-8859-1, sedangkan pengguna Linux cenderung menyukai UTF-8. Java menggunakan UTF-16 secara asli.

Satu urutan nilai byte untuk karakter dalam satu pengkodean mungkin berarti karakter yang sama sekali berbeda di pengkodean lain, atau bahkan mungkin tidak valid.

Misalnya, dalam ISO 8859-1 , â diwakili oleh satu byte dari nilai 226, sedangkan di UTF-8 itu adalah dua byte: 195, 162. Namun, dalam ISO 8859-1 , 195, 162akan ada dua karakter, Ã, ¢ .

Ketika komputer menyimpan data tentang karakter secara internal atau mengirimkannya ke sistem lain, mereka menyimpan atau mengirim byte. Bayangkan sebuah sistem membuka file atau menerima pesan melihat byte195, 162 . Bagaimana cara mengetahui karakter apa ini?

Agar sistem dapat mengartikan byte tersebut sebagai karakter aktual (dan karenanya menampilkannya atau mengonversinya ke pengkodean lain), perlu mengetahui pengkodean yang digunakan. Itulah sebabnya penyandian muncul dalam header XML atau dapat ditentukan dalam editor teks. Ini memberitahu sistem pemetaan antara byte dan karakter.

rghome
sumber