Mengapa ada beberapa pengkodean Unicode?

41

Saya pikir Unicode dirancang untuk mengatasi seluruh masalah memiliki banyak pengkodean yang berbeda karena ruang alamat kecil (8 bit) di sebagian besar upaya sebelumnya (ASCII, dll.).

Lalu mengapa ada begitu banyak pengkodean Unicode? Bahkan beberapa versi dari yang (pada dasarnya) sama, seperti UTF-8, UTF-16, dll.

Matthew Scharley
sumber
11
UTF-8 tidak sama dengan UTF-16. Daftar ini akan bertambah segera setelah kita menemukan sistem tata surya lain dengan planet seperti bumi.
setzamora
1
@ Joseph: Kami sudah memiliki Klingon. Kami memiliki sebagian besar bahasa bumi di BMP dengan sedikit tumpahan ke dataran 1,2. Jika permintaan saat ini benar dan hanya ada 42 spesies makhluk hidup di galaksi yang mencapai titik di mana mereka dapat menggunakan perjalanan ruang angkasa (sehingga memungkinkan kontak pertama) kita harus dapat memeras semua karakter dalam semua bahasa ke dalam UNICODE (dengan asumsi kita dapat memperluas dari 21 hingga 22 bit untuk memungkinkan 64 dataran). Itu bahkan menyisakan 10 bit ruang penyangga jika kita ingin memasukkan spesies primitif yang belum mencapai penerbangan ruang angkasa.
Martin York
7
@Kevin Hsu: UTF-7,8,16LE, 16BE, 32LE, 32BE. Jadi, setidaknya ada 6 pengkodean nyata. UTF-9 dan UTF-18 adalah April Mop.
MSalters
9
Hal yang baik tentang standar adalah ada begitu banyak standar
Homde
1
Lihat apa yang Spolsky katakan tentang Unicode dan penyandian .
MPelletier

Jawaban:

29

Karena orang tidak ingin menghabiskan 21 bit untuk setiap karakter. Pada semua sistem modern, ini pada dasarnya berarti menggunakan tiga byte per karakter, yang tiga kali lebih banyak dari yang digunakan orang, sehingga mereka tidak mau mengadopsi Unicode sama sekali. Kompromi harus ditemukan: misalnya UTF-8 bagus untuk teks bahasa Inggris karena file ASCII lama tidak perlu dikonversi sama sekali, tetapi kurang berguna untuk bahasa Eropa, dan sedikit digunakan untuk bahasa Asia.

Jadi pada dasarnya, ya, kita bisa mendefinisikan satu pengodean universal serta bagan karakter universal tunggal, tetapi pasar tidak akan menerimanya.

Kilian Foth
sumber
8
+1 Jawaban bagus. Sejujurnya itu adalah satu-satunya yang benar-benar menjawab pertanyaan ini. Semua jawaban lain adalah (kurang lebih) tentang bagaimana byte diletakkan dalam semua pengkodean unicode yang berbeda.
Jacek Prucia
Secara historis itu adalah masalah ketidaksepakatan yang sederhana. Namun, saya tidak melihat banyak gunanya untuk apa pun kecuali UTF-8 hari ini, sementara ada skenario teoritis di mana UTF-16 akan mengkonsumsi lebih sedikit ruang, itu bukan dengan margin besar, dan mereka jarang. Tempat paling menonjol di mana Anda ingin menghemat ruang adalah untuk situs web, tetapi penuh dengan kode HTML yang sejauh ini terpendek menggunakan UTF-8. Misalnya, Anda dapat menggunakan Shift JISuntuk membuat situs web Jepang lebih kecil daripada yang setara dengan UTF-8, tetapi itu hanya berfungsi karena itu rangkaian karakter khusus untuk bahasa Jepang.
aaaaaaaaaaaa
2
Tidak juga benar. Karena format terkompresi benar-benar hanya digunakan untuk transportasi dan penyimpanan. Dalam suatu aplikasi, biasanya menggunakan UCS-2 atau UCS-4 karena ini lebar tetap tetapi ini membutuhkan 2 atau 4 byte per karakter. Jadi aplikasi bersedia memberikan ruang untuk kemudahan penggunaan.
Martin York
but it is less useful for European languages, and of little use for Asian languages- ini salah. Yang dimaksud dengan "kegunaan" adalah kompresi? Nah, kemudian UTF-8 memberikan kompresi yang lebih baik untuk bahasa-bahasa Eropa karena di setiap teks ada spasi dan tanda baca yang hanya membutuhkan satu byte.
Nick Volynkin
37

Unicode adalah karakter berkode 21 bit yang secara unik menggambarkan "CodePoints" setiap poin kode yang diwakili oleh mesin terbang (representasi grafis).

  • 16 bit digunakan untuk mengidentifikasi titik kode di pesawat (sebagian besar titik kode berada di pesawat 0).
  • 5 bit untuk mengidentifikasi bidang.

Penyandian yang didukung adalah:

  • UTF-8 (untuk menyandikan setiap titik menggunakan nilai 8 bit)
  • UTF-16 (untuk menyandikan setiap titik menggunakan nilai 16 bit)
  • UTF-32 (untuk menyandikan setiap titik menggunakan nilai 32 bit)

Tetapi tidak peduli apa pengkodean ketika Anda mendekode mereka semua memetakan kembali ke codepoint tertentu yang memiliki arti yang sama (itulah sebabnya itu keren).

UTF-8

Ini adalah format berukuran variabel. Di mana setiap codepoint diwakili oleh 1 hingga 4 byte.

UTF-16

Ini adalah format berukuran variabel. Poin kode pada "Basic Multilingual plane" (BMP atau Plane 0) dapat diwakili oleh 1 nilai 16 bit tunggal. Poin kode pada pesawat lain diwakili oleh pasangan pengganti (nilai 2 16 bit).

UTF-32

Ini adalah format ukuran tetap. Semua poin kode diwakili oleh nilai 32 bit tunggal.

Martin York
sumber
2
Saya suka jawaban ini juga. Sudah menulis yang serupa, tetapi yang ini jelas. Saya juga menambahkan bahwa UTF-8 juga berguna karena string ASCII secara otomatis UTF-8.
Kevin Hsu
4
Tolong, ini Pesawat Multilingual Dasar , bukan dataran .
JSB ձոգչ
3
Ini adalah jawaban yang baik, tetapi saya pikir itu masih menimbulkan pertanyaan, "Mengapa?", Meskipun jawaban ini secara tersirat menyentuh itu. Untuk menguraikan: UTF-32 adalah pendekatan yang lebih langsung (beberapa orang akan mengatakan lebih mudah) dari pengkodean karakter Unicode, tetapi juga membuang banyak ruang, karena masing-masing dan setiap karakter membutuhkan 4 byte. UTF-8 jauh lebih kompak dan kompatibel dengan ASCII, tetapi itu tidak biasa: sebuah karakter dapat memakan waktu mulai dari 1 hingga 4 byte untuk dikodekan, yang membuatnya lebih sulit untuk dikerjakan. UTF-16 adalah semacam pendekatan hybrid antara keduanya, sebagian besar dengan pro dan kontra masing-masing.
mipadi
4
Ada tradeoff antara penggunaan memori (di mana UTF-8 adalah yang terbaik, karena karakter yang paling umum adalah single-byte) dan kecepatan pemrosesan (di mana UTF-32 adalah yang terbaik, karena semua karakter memiliki ukuran yang sama, memungkinkan untuk optimasi tertentu dan memberikan kesempurnaan Perataan 32-bit dalam memori). Sebagai hasilnya, protokol jaringan dan format file biasanya menggunakan UTF-8 (untuk menghemat bandwidth / ruang penyimpanan), sedangkan juru bahasa script dan runtime bahasa mungkin lebih suka UTF-16 atau UTF-32.
tdammers
2
@Marcel: "CodePoint" adalah "CodePoint" bukan a character(karena karakter dapat dibangun dari beberapa "CodePoints"). Jangan sampai kedua istilah ini bingung. Tapi Anda benar "CodePoints" tidak merujuk ke mesin terbang. Mesin terbang hanyalah representasi grafis dari titik kode. Perbedaan yang halus tetapi penting.
Martin York
25

Saya pikir ini berguna untuk memisahkan 2 ide:

  1. Unicode - pemetaan karakter dari seluruh dunia ke titik kode.
  2. Pengkodean - pemetaan titik kode ke pola bit (UTF-8, UTF-16, dll).

UTF-8, UTF-16, dan pengkodean lainnya memiliki kelebihan dan kekurangan masing-masing. Lebih baik berkonsultasi dengan Wikipedia tentang hal itu.

jfs
sumber
@ jfs: Mengapa memiliki Unicode sama sekali jika masih akan ada selusin atau lebih pengkodean yang semuanya berbeda pada kabel? Apa manfaatnya memiliki pemetaan global?
Matthew Scharley
10
@Matthew Scharley: Anda salah melihatnya. UNICODE memetakan semua karakter dari semua bahasa (termasuk Klingon) ke ID UNIK (codepoint). Pengkodean hanyalah cara mengompresi codepoint ke disk atau stream di jaringan. UTF adalah singkatan dari "UNICODE Transport format". Anda harus selalu berpikir tentang titik kode UNICODE sebagai nilai 21 bit. Keuntungan dari format lain adalah bahwa semua karakter diidentifikasi secara unik dan tidak tumpang tindih (Tidak seperti Latin-1, Latin-2 dll).
Martin York
@Matthew Scharley Mengapa memiliki pemetaan global? Sebenarnya semua orang memiliki pemetaan sendiri di masa lalu (ingat halaman kode?). Saya pikir contoh konyol akan menghapus semuanya. Bayangkan ide cinta. Bagaimana Anda akan mewakilinya kepada seseorang? Memberikan bunga-bunga? Katakan "Aku cinta kamu"? Setiap orang memiliki caranya sendiri untuk mengekspresikannya. Cinta (yang merupakan ide abstrak) seperti poin kode. Mengekspresikannya seperti pengkodean. :)
jfs
4
Unicode adalah alfabet global. UTF-x adalah cara diangkut oleh komputer, karena sulit untuk mendorong kertas melalui kabel.
Mel
1
@ Martin, Klingon sebenarnya tidak berhasil. Tengwar atau Cirith juga tidak digunakan untuk menulis bahasa peri Tolkein.
TRiG
9

UTF-7, UTF-8, UTF-16 dan UTF-32 hanyalah format transformasi algoritmik dari pengkodean (codepoint) karakter yang sama. Mereka adalah pengkodean dari satu sistem kodifikasi karakter.

Mereka juga secara algoritmik lebih mudah dinavigasi maju dan mundur daripada kebanyakan skema sebelumnya untuk berurusan dengan set karakter yang lebih besar dari 256 karakter.

Ini sangat berbeda dari kodifikasi mesin terbang yang umumnya negara dan kadang-kadang khusus vendor. Di Jepang sendiri, ada satu ton variasi JIS saja, belum lagi EUC-JP dan transformasi JIS yang berorientasi codepage yang digunakan mesin DOS / Windows yang disebut Shift-JIS. (Sampai batas tertentu, ada transformasi algoritmik dari ini, tetapi mereka tidak terlalu sederhana dan ada perbedaan vendor-spesifik dalam karakter yang tersedia. Kalikan ini dengan beberapa ratus negara dan evolusi bertahap dari sistem font yang lebih canggih (post greenscreen) era), dan Anda memiliki mimpi buruk yang nyata.

Mengapa Anda memerlukan bentuk transformasi Unicode ini? Karena banyak sistem lama mengasumsikan urutan karakter ASCII-range 7 bit, jadi Anda membutuhkan solusi bersih 7-bit yang aman mengirimkan data tanpa gangguan melalui sistem-sistem tersebut, maka Anda membutuhkan UTF-7. Kemudian ada sistem yang lebih modern yang dapat menangani set karakter 8-bit, tetapi nulls umumnya memiliki arti khusus untuk mereka, sehingga UTF-16 tidak bekerja untuk mereka. 2 byte dapat menyandikan seluruh bidang multibahasa dasar Unicode dalam inkarnasi pertamanya, sehingga UCS-2 tampak seperti pendekatan yang masuk akal untuk sistem yang akan menjadi "Unicode aware from the up up" (seperti Windows NT dan Java VM); maka ekstensi di luar itu mengharuskan karakter tambahan, yang menghasilkan transformasi algoritmik dari pengkodean senilai 21 bit yang dicadangkan oleh standar Unicode, dan pasangan pengganti dilahirkan; yang mengharuskan UTF-16. Jika Anda memiliki beberapa aplikasi di mana konsistensi lebar karakter lebih penting daripada efisiensi penyimpanan, UTF-32 (dulu disebut UCS-4) adalah sebuah pilihan.

UTF-16 adalah satu-satunya hal yang jauh rumit untuk dihadapi, dan itu mudah dimitigasi oleh sejumlah kecil karakter yang dipengaruhi oleh transformasi ini dan fakta bahwa urutan 16-bit memimpin dengan rapi dalam rentang yang benar-benar berbeda dari jejak. Urutan 16-bit. Ini juga dunia yang lebih mudah daripada mencoba untuk bergerak maju dan mundur dalam banyak penyandian Asia Timur awal, di mana Anda membutuhkan mesin negara (JIS dan EUC) untuk menangani urutan pelarian, atau berpotensi untuk memindahkan beberapa karakter hingga Anda menemukan sesuatu yang dijamin. hanya menjadi byte memimpin (Shift-JIS). UTF-16 memiliki beberapa keunggulan pada sistem yang dapat memotong urutan 16-bit secara efisien juga.

Kecuali Anda harus menjalani puluhan (ratusan, benar-benar) dari berbagai pengkodean di luar sana, atau harus membangun sistem yang mendukung banyak bahasa dalam pengkodean yang berbeda kadang-kadang bahkan dalam dokumen yang sama (seperti WorldScript dalam versi MacO yang lebih lama), Anda mungkin berpikir format transformasi unicode sebagai kompleksitas yang tidak perlu. Tapi ini adalah pengurangan dramatis dalam kompleksitas dibandingkan alternatif sebelumnya, dan masing-masing format memecahkan kendala teknis nyata. Mereka juga sangat efisien konversi antara satu sama lain, tidak memerlukan tabel pencarian yang rumit.

Jason True
sumber
1
Berbagai mesin negara JIS dan EUC benar-benar jahat, dan jadi ganda jika Anda bekerja untuk mentransformasikannya. Unicode sangat menyederhanakan itu. Satu-satunya masalah utama dengan Unicode adalah bahwa Anda harus berhenti memikirkan byte sebagai karakter, Anda ASCII-menggunakan chauvinist kecil-karakter-setted Anda!
Donal Fellows
6

Unicode tidak dirancang untuk mengatasi seluruh masalah memiliki banyak pengkodean yang berbeda.

Unicode dirancang untuk menyelesaikan seluruh masalah satu nomor yang mewakili banyak hal berbeda tergantung pada halaman kode yang digunakan. Angka 0 - 127 mewakili karakter yang sama di halaman kode Ansi apa pun. Inilah yang juga dikenal sebagai bagan ASCII atau rangkaian karakter. Di halaman kode Ansi, yang memungkinkan 256 karakter, angka 128 - 255 mewakili karakter berbeda di halaman kode berbeda.

Sebagai contoh

  • Angka $ 57 mewakili huruf kapital W di semua halaman kode, tetapi
  • Number $ EC mewakili simbol inifinity dalam kode halaman 437 (AS), tetapi "SURAT KECIL LATIN N DENGAN CEDILLA" dalam kode halaman 775 (Baltik)
  • Tanda Cent adalah nomor $ 9B pada kode halaman 437, tetapi angka 96 pada kode halaman 775

Apa yang Unicode lakukan, adalah membalikkan semua ini. Di Unicode tidak ada "reuse". Setiap angka mewakili satu karakter unik. Nomor $ 00A2 dalam Unicode adalah tanda cent dan tanda cent tidak muncul di tempat lain dalam definisi Unicode.

Lalu mengapa ada begitu banyak pengkodean Unicode? Bahkan beberapa versi dari yang (pada dasarnya) sama, seperti UTF-8, UTF-16, dll.

Tidak ada beberapa versi pengkodean yang sama. Ada beberapa pengkodean dari peta definisi karakter Unicode yang sama dan ini telah "diciptakan" untuk mengelola persyaratan penyimpanan untuk penggunaan yang berbeda dari berbagai bidang bahasa yang ada di Unicode.

Unicode mendefinisikan (atau memiliki ruang untuk mendefinisikan) 4.294.967.295 karakter unik. Jika Anda ingin memetakan ini ke penyimpanan disk / memori tanpa melakukan konversi algoritmik, Anda memerlukan 4 byte per karakter. Jika Anda perlu menyimpan teks dengan karakter dari semua bidang bahasa, maka UTF-32 (yang pada dasarnya adalah 1 karakter lurus - penyandian penyimpanan 4 byte dari definisi unicode) mungkin adalah yang Anda butuhkan.

Tetapi hampir tidak ada teks yang menggunakan karakter dari semua bidang bahasa. Dan kemudian menggunakan 4 byte per karakter tampaknya sia-sia. Terutama ketika Anda memperhitungkan bahwa sebagian besar bahasa di bumi didefinisikan dalam apa yang dikenal sebagai Basic Multi-lingual Plane (BMP): angka 65536 pertama dari definisi Unicode.

Dan di situlah UTF-16 masuk. Jika Anda hanya menggunakan karakter dari BMP, UTF-16 akan menyimpannya dengan sangat efisien menggunakan hanya dua byte per karakter. Itu hanya akan menggunakan lebih banyak byte untuk karakter di luar BMP. Perbedaan antara UTF-16LE (Little Endian) dan UTF-16BE (Big Endian) benar-benar hanya ada hubungannya dengan bagaimana angka diwakili dalam memori komputer (pola byte yang A0berarti hex $ A0 atau berarti $ 0A).

Jika teks Anda menggunakan lebih sedikit karakter berbeda, seperti kebanyakan teks dalam bahasa Eropa Barat, Anda akan ingin membatasi persyaratan penyimpanan untuk teks Anda lebih banyak lagi. Oleh karena itu UTF-8, yang menggunakan byte tunggal untuk menyimpan karakter yang ada dalam grafik ASCII (128 angka pertama) dan pilihan dari karakter Ansi (128 angka kedua dari berbagai halaman kode). Ini hanya akan menggunakan lebih banyak byte untuk karakter di luar set "karakter yang paling banyak digunakan" ini.

Jadi untuk rekap:

  • Unicode adalah pemetaan karakter dalam semua bahasa di bumi (dan beberapa Klingon untuk di-boot) dan kemudian beberapa (matematika, musik, dll.) Ke nomor unik.
  • Pengkodean adalah algoritme yang didefinisikan untuk menyimpan teks menggunakan nomor peta karakter unik ini seefisien mungkin dengan "penggunaan rata-rata" karakter dalam teks.
Marjan Venema
sumber
2
"Angka 0 - 127 mewakili karakter yang sama di halaman kode apa pun." - baik, kecuali Anda berbicara EBCDIC, dalam hal $57ini bukan W
MSalters
@MSalters: Anda memang benar. EBCDIC berbeda (dan ada yang lain EBCDIC). Saya kira hari-hari mainframe saya begitu lama di belakang saya sehingga saya tidak ingat, atau saya telah menekan kenangan ini terlalu keras dan terlalu lama ... :-)
Marjan Venema
"Angka 0 - 127 mewakili karakter yang sama di halaman kode apa pun." Sebenarnya ada penyandian, seperti BinarySignWriting, yang bukan superset dari ASCII. BinarySignWriting, pada kenyataannya, tidak termasuk karakter ASCII sama sekali.
TRiG
@TRiG: Itu sebabnya saya mengedit pernyataan saya untuk secara spesifik tentang halaman kode Ansi. Pasti melakukan itu sebelum kamu segar ...
Marjan Venema
Iya nih. Ada komentar tambahan dan pembaruan pos dibuat saat saya menulis komentar saya. Namun, BinarySignWriting menarik.
TRiG
2

Unicode mendefinisikan peta antara angka dan karakter. Namun, ketika Anda mengirim nomor ke penerima, Anda masih perlu menentukan cara merepresentasikan nomor itu. Untuk itulah UTF diperuntukkan. Ini mendefinisikan bagaimana mewakili angka dalam aliran byte.

Codism
sumber
2

Alasan di balik UTF-32 sederhana: Ini adalah representasi paling mudah dari poin kode Unicode. Jadi mengapa tidak semuanya di UTF-32? Dua alasan utama:

Satu adalah ukuran . UTF-32 membutuhkan 4 byte untuk setiap karakter. Untuk teks yang hanya menggunakan karakter di Basic Multilingual Place, ini dua kali lebih banyak dari UTF-16. Untuk teks bahasa Inggris, ruangnya 4 kali lebih banyak dari US-ASCII.

Alasan yang lebih besar adalah kompatibilitas ke belakang . Setiap pengkodean Unicode selain dari "unencoded" UTF-32 dirancang untuk kompatibilitas dengan standar sebelumnya.

  • UTF-8: Kompatibilitas mundur dengan US-ASCII.
  • UTF-16: Kompatibilitas mundur dengan UCS-2 (Unicode 16-bit sebelum diperluas melampaui BMP).
  • UTF-7: Kompatibilitas mundur dengan server surat non-8-bit-clean.
  • GB18030: Kompatibilitas mundur dengan penyandian GB2312 dan GBK untuk bahasa Mandarin.
  • UTF-EBCDIC: Kompatibilitas mundur dengan subset Latin Dasar dari EBCDIC.

Saya pikir Unicode dirancang untuk mengatasi seluruh masalah memiliki banyak pengkodean yang berbeda

Ya, dan memang begitu. Jauh lebih mudah untuk mengkonversi antara UTF-8, -16, dan -32 daripada berurusan dengan sistem lama ratusan pengkodean karakter yang berbeda untuk bahasa yang berbeda dan OS yang berbeda.

dan04
sumber
1

Anda tahu bahwa file zip dapat mengkompres file menjadi lebih kecil (terutama teks) dan kemudian mengompresnya ke salinan identik dari file asli.

Algoritma zipping sebenarnya memiliki beberapa algoritma yang berbeda dengan karakteristik yang berbeda untuk dipilih: disimpan (tidak ada kompresi), Shrunk, Reduced (metode 1-4), Imploded, Tokenizing, Deflated, Deflate64, BZIP2, LZMA (EFS), WavPack, PPMd, di mana secara teoritis bisa mencoba semuanya dan memilih hasil terbaik tetapi biasanya hanya pergi dengan Deflated.

UTF bekerja dengan cara yang sama. Ada beberapa algoritma pengkodean masing-masing dengan karakteristik yang berbeda, tetapi Anda biasanya hanya memilih UTF-8 karena didukung secara luas sebagai lawan dari varian-UTF lainnya, yang pada gilirannya adalah karena bitwise kompatibel dengan 7-bit ASCII sehingga memudahkan untuk gunakan pada sebagian besar platform komputer modern yang biasanya menggunakan ekstensi ASCII 8-bit.


sumber
ørn: Perbedaannya dengan file zip adalah ada header yang memberi tahu Anda apa kompresi yang berlaku. Dengan file teks, kita masih harus menebak bukan?
Matthew Scharley
Ada urutan khusus yang memberitahukan hal itu. Karena kompatibilitas ke belakang dengan ASCII itu opsional.