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.
unicode
text-encoding
Matthew Scharley
sumber
sumber
Jawaban:
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.
sumber
Shift JIS
untuk membuat situs web Jepang lebih kecil daripada yang setara dengan UTF-8, tetapi itu hanya berfungsi karena itu rangkaian karakter khusus untuk bahasa Jepang.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.Unicode adalah karakter berkode 21 bit yang secara unik menggambarkan "CodePoints" setiap poin kode yang diwakili oleh mesin terbang (representasi grafis).
Penyandian yang didukung adalah:
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-32 => 0x00000041 UTF-16 => 0x0041 UTF-8 => 0x41
UTF-32 => 0x00000153 UTF-16 => 0x0153 UTF-8 => 0xC5 0x93
UTF-32 => 0x00011153 UTF-16 => 0xD804 0xDD53 UTF-8 => 0xF0 0x91 0x85 0x93
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.
sumber
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.Saya pikir ini berguna untuk memisahkan 2 ide:
UTF-8, UTF-16, dan pengkodean lainnya memiliki kelebihan dan kekurangan masing-masing. Lebih baik berkonsultasi dengan Wikipedia tentang hal itu.
sumber
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.
sumber
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
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.
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
A0
berarti 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:
sumber
$57
ini bukan WUnicode 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.
sumber
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.
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.
sumber
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