Perbedaan antara UTF-8 dan UTF-16? Mengapa kita membutuhkan ini?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
Jawaban:
Saya yakin ada banyak artikel bagus tentang ini di seluruh Web, tapi berikut ringkasan singkatnya.
Baik UTF-8 dan UTF-16 adalah pengkodean panjang variabel. Namun, pada UTF-8 sebuah karakter dapat menempati minimal 8 bit, sedangkan pada UTF-16 panjang karakter dimulai dengan 16 bit.
Pro UTF-8 utama:
Kontra UTF-8 utama:
Pro UTF-16 utama:
char
sebagai komponen primitif dari string.Kontra UTF-16 utama:
Secara umum, UTF-16 biasanya lebih baik untuk representasi dalam memori karena BE / LE tidak relevan di sana (cukup gunakan urutan asli) dan pengindeksan lebih cepat (jangan lupa untuk menangani pasangan pengganti dengan benar). UTF-8, di sisi lain, sangat bagus untuk file teks dan protokol jaringan karena tidak ada masalah BE / LE dan penghentian null sering kali berguna, serta kompatibilitas ASCII.
sumber
Mereka hanyalah skema yang berbeda untuk mewakili karakter Unicode.
Keduanya memiliki panjang variabel - UTF-16 menggunakan 2 byte untuk semua karakter dalam bidang multibahasa dasar (BMP) yang berisi sebagian besar karakter yang umum digunakan.
UTF-8 menggunakan antara 1 dan 3 byte untuk karakter di BMP, hingga 4 untuk karakter dalam rentang Unicode saat ini dari U + 0000 hingga U + 1FFFFF, dan dapat diperluas hingga U + 7FFFFFFF jika diperlukan ... tetapi terutama semua karakter ASCII diwakili dalam satu byte masing-masing.
Untuk tujuan intisari pesan, tidak masalah mana dari intisari ini yang Anda pilih, selama semua orang yang mencoba membuat ulang intisari menggunakan opsi yang sama.
Lihat halaman ini untuk mengetahui lebih lanjut tentang UTF-8 dan Unicode.
(Perhatikan bahwa semua karakter Java adalah poin kode UTF-16 di dalam BMP; untuk mewakili karakter di atas U + FFFF, Anda perlu menggunakan pasangan pengganti di Java.)
sumber
Keamanan: Gunakan hanya UTF-8
Setidaknya ada beberapa kerentanan keamanan dalam implementasi UTF-16 . Lihat Wikipedia untuk detailnya .
WHATWG dan W3C sekarang telah menyatakan bahwa hanya UTF-8 yang akan digunakan di Web.
Kelompok lain mengatakan hal yang sama.
Jadi, sementara UTF-16 dapat terus digunakan secara internal oleh beberapa sistem seperti Java dan Windows, sedikit sekali penggunaan UTF-16 yang mungkin pernah Anda lihat di masa lalu untuk file data, pertukaran data, dan semacamnya, kemungkinan besar akan menghilang seluruhnya.
sumber
Ini tidak terkait dengan UTF-8/16 (secara umum, meskipun memang dikonversi ke UTF16 dan bagian BE / LE dapat disetel dengan satu baris), namun di bawah ini adalah cara tercepat untuk mengubah String menjadi byte []. Misalnya: bagus persis untuk kasus yang disediakan (kode hash). String.getBytes (enc) relatif lambat.
static byte[] toBytes(String s){ byte[] b=new byte[s.length()*2]; ByteBuffer.wrap(b).asCharBuffer().put(s); return b; }
sumber
Cara sederhana untuk membedakan UTF-8 dan UTF-16 adalah dengan mengidentifikasi kesamaan di antara keduanya.
Selain berbagi nomor unicode yang sama untuk karakter tertentu, masing-masing memiliki formatnya sendiri.
UTF-8 mencoba untuk menyatakan, setiap nomor unicode diberikan kepada karakter dengan satu byte (Jika itu adalah ASCII), selain itu 2 dua byte, selain itu 4 byte dan seterusnya ...
UTF-16 mencoba untuk menyatakan, setiap nomor unicode diberikan kepada karakter dengan dua byte sebagai permulaan. Jika dua byte tidak cukup, maka gunakan 4 byte. JIKA itu juga tidak cukup, maka gunakan 6 byte.
Secara teoritis, UTF-16 lebih hemat ruang, tetapi dalam praktiknya UTF-8 lebih hemat ruang karena sebagian besar karakter (98% data) untuk diproses adalah ASCII dan UTF-8 mencoba merepresentasikannya dengan byte tunggal dan UTF-16 cobalah untuk merepresentasikannya dengan 2 byte.
Selain itu, UTF-8 adalah superset dari pengkodean ASCII. Jadi setiap aplikasi yang mengharapkan data ASCII juga akan diterima oleh prosesor UTF-8. Ini tidak benar untuk UTF-16. UTF-16 tidak dapat memahami ASCII, dan ini merupakan rintangan besar bagi adopsi UTF-16.
Hal lain yang perlu diperhatikan adalah, semua UNICODE saat ini dapat dimuat dalam maksimum 4 byte UTF-8 (Mengingat semua bahasa di dunia). Ini sama dengan UTF-16 dan tidak ada penghematan nyata dalam ruang dibandingkan dengan UTF-8 ( https://stackoverflow.com/a/8505038/3343801 )
Jadi, orang menggunakan UTF-8 jika memungkinkan.
sumber