Mengapa kita perlu Unicode?
Pada hari-hari awal (tidak terlalu), semua yang ada adalah ASCII. Ini baik-baik saja, karena yang diperlukan hanyalah beberapa karakter kontrol, tanda baca, angka dan huruf seperti yang ada di kalimat ini. Sayangnya, dunia yang aneh saat ini dari komunikasi global dan media sosial tidak diramalkan, dan tidak terlalu aneh untuk melihat bahasa Inggris, العربية, 汉语, עִבְרִית, ελληνικά, dan ភាសាខ្មែរ dalam dokumen yang sama (saya harap saya tidak merusak yang lama) browser).
Tetapi demi argumen, katakanlah Joe Average adalah pengembang perangkat lunak. Dia bersikeras bahwa dia hanya akan membutuhkan bahasa Inggris, dan karena itu hanya ingin menggunakan ASCII. Ini mungkin baik untuk Joe pengguna , tetapi ini tidak baik untuk Joe pengembang perangkat lunak . Kira-kira separuh dunia menggunakan karakter non-Latin dan menggunakan ASCII bisa dibilang tidak mempertimbangkan orang-orang ini, dan di atas itu, ia menutup perangkat lunaknya ke ekonomi yang besar dan terus berkembang.
Oleh karena itu, diperlukan set karakter yang mencakup termasuk semua bahasa. Demikianlah datang Unicode. Ini memberikan setiap karakter nomor unik yang disebut titik kode . Satu keuntungan dari Unicode dibanding set lain yang mungkin adalah bahwa 256 titik kode pertama identik dengan ISO-8859-1 , dan karenanya juga ASCII. Selain itu, sebagian besar karakter yang umum digunakan hanya dapat diwakili oleh dua byte, di wilayah yang disebut Basic Multilingual Plane (BMP) . Sekarang diperlukan pengkodean karakter untuk mengakses rangkaian karakter ini, dan ketika pertanyaan diajukan, saya akan berkonsentrasi pada UTF-8 dan UTF-16.
Pertimbangan memori
Jadi berapa banyak byte yang memberikan akses ke karakter apa dalam pengkodean ini?
- UTF-8:
- 1 byte: ASCII Standar
- 2 byte: Arab, Ibrani, sebagian besar skrip Eropa (paling tidak termasuk Georgia )
- 3 byte: BMP
- 4 byte: Semua karakter Unicode
- UTF-16:
- 2 byte: BMP
- 4 byte: Semua karakter Unicode
Perlu disebutkan sekarang bahwa karakter yang tidak ada dalam BMP termasuk skrip kuno, simbol matematika, simbol musik, dan karakter Cina / Jepang / Korea (CJK) yang lebih jarang .
Jika Anda sebagian besar akan bekerja dengan karakter ASCII, maka UTF-8 tentu saja lebih hemat memori. Namun, jika Anda bekerja sebagian besar dengan skrip non-Eropa, menggunakan UTF-8 bisa mencapai 1,5 kali lebih efisien memori daripada UTF-16. Saat berurusan dengan sejumlah besar teks, seperti halaman web yang besar atau dokumen kata yang panjang, ini dapat memengaruhi kinerja.
Dasar-dasar penyandian
Catatan: Jika Anda tahu bagaimana UTF-8 dan UTF-16 dikodekan, lewati ke bagian selanjutnya untuk aplikasi praktis.
- UTF-8: Untuk karakter ASCII standar (0-127), kode UTF-8 identik. Ini membuat UTF-8 ideal jika kompatibilitas ke belakang diperlukan dengan teks ASCII yang ada. Karakter lain membutuhkan dari 2-4 byte. Ini dilakukan dengan menyimpan beberapa bit dalam setiap byte ini untuk menunjukkan bahwa itu adalah bagian dari karakter multi-byte. Secara khusus, bit pertama dari setiap byte adalah
1
untuk menghindari bentrok dengan karakter ASCII.
- UTF-16: Untuk karakter BMP yang valid, representasi UTF-16 hanyalah titik kodenya. Namun, untuk karakter non-BMP UTF-16 memperkenalkan pasangan pengganti . Dalam hal ini kombinasi dua bagian dua byte memetakan ke karakter non-BMP. Bagian dua byte ini berasal dari rentang numerik BMP, tetapi dijamin oleh standar Unicode tidak valid sebagai karakter BMP. Selain itu, karena UTF-16 memiliki dua byte sebagai unit dasarnya, ia dipengaruhi oleh endianness . Untuk mengkompensasi, tanda urutan byte yang dipesan dapat ditempatkan di awal aliran data yang menunjukkan endianness. Jadi, jika Anda membaca input UTF-16, dan tidak ada endianness yang ditentukan, Anda harus memeriksanya.
Seperti dapat dilihat, UTF-8 dan UTF-16 sama sekali tidak kompatibel satu sama lain. Jadi jika Anda melakukan I / O, pastikan Anda tahu pengkodean mana yang Anda gunakan! Untuk detail lebih lanjut tentang penyandian ini, silakan lihat FAQ UTF .
Pertimbangan pemrograman praktis
Jenis data karakter dan string: Bagaimana mereka dikodekan dalam bahasa pemrograman? Jika mereka adalah byte mentah, saat Anda mencoba untuk mengeluarkan karakter non-ASCII, Anda mungkin mengalami beberapa masalah. Juga, bahkan jika jenis karakter didasarkan pada UTF, itu tidak berarti string UTF yang tepat. Mereka dapat mengizinkan urutan byte yang ilegal. Secara umum, Anda harus menggunakan pustaka yang mendukung UTF, seperti ICU untuk C, C ++ dan Java. Bagaimanapun, jika Anda ingin memasukkan / mengeluarkan sesuatu selain dari penyandian default, Anda harus mengubahnya terlebih dahulu.
Pengkodean yang disarankan / standar / dominan: Ketika diberi pilihan UTF mana yang akan digunakan, biasanya yang terbaik adalah mengikuti standar yang direkomendasikan untuk lingkungan tempat Anda bekerja. Misalnya, UTF-8 dominan di web, dan sejak HTML5, itu telah direkomendasikan sebagai pengkodean . Sebaliknya, lingkungan .NET dan Java didasarkan pada tipe karakter UTF-16. Membingungkan (dan salah), referensi sering dibuat ke "Unicode encoding", yang biasanya merujuk pada pengkodean UTF dominan di lingkungan tertentu.
Dukungan perpustakaan: Perpustakaan yang Anda gunakan mendukung semacam pengkodean. Yang mana? Apakah mereka mendukung kasus sudut? Karena kebutuhan adalah induk dari penemuan, perpustakaan UTF-8 umumnya akan mendukung karakter 4-byte dengan benar, karena 1, 2, dan bahkan 3 byte karakter dapat sering terjadi. Namun, tidak semua perpustakaan UTF-16 yang diakui mendukung pasangan pengganti dengan benar karena jarang terjadi.
Menghitung karakter: Ada menggabungkan karakter di Unicode. Misalnya titik kode U + 006E (n), dan U + 0303 (gabungan tilde) membentuk ñ, tetapi titik kode U + 00F1 membentuk ñ. Mereka harus terlihat identik, tetapi algoritma penghitungan sederhana akan mengembalikan 2 untuk contoh pertama, 1 untuk yang terakhir. Ini tidak selalu salah, tetapi mungkin juga bukan hasil yang diinginkan.
Membandingkan kesetaraan: A, А, dan Α terlihat sama, tetapi masing-masing berbahasa Latin, Sirilik, dan Yunani. Anda juga memiliki kasus seperti C dan Ⅽ, satu adalah surat, yang lain angka Romawi. Selain itu, kami memiliki karakter penggabungan yang perlu dipertimbangkan juga. Untuk info lebih lanjut lihat Karakter duplikat di Unicode .
Pasangan pengganti: Ini cukup sering muncul di SO, jadi saya hanya akan memberikan beberapa contoh tautan:
Lainnya ?: