Mengapa Java menggunakan UTF-16 untuk representasi string internal?

29

Saya akan membayangkan alasannya cepat, array seperti akses ke karakter di indeks, tetapi beberapa karakter tidak akan masuk ke dalam 16 bit, jadi itu tidak akan berhasil ...

Jadi jika Anda harus menangani kasus khusus, mengapa tidak menggunakan UTF-8 saja?

mrpyo
sumber
4
Sesuatu untuk ditanyakan pada desainer Java, bukan pada masyarakat luas. Voting untuk ditutup tidak konstruktif.
Oded
16
@Oded: benar-benar tidak beralasan, seperti yang ditunjukkan oleh jawaban DeadMG.
Michael Borgwardt
Saya bingung: Saya cukup yakin bahwa pertanyaan ini sudah dijawab (baik di sini maupun di SO), tetapi saya tidak dapat menemukan duplikatnya.
Joachim Sauer
Untuk kismis histeris. Lihat utf8everywhere.org
Pavel Radzivilovsky

Jawaban:

47

Karena dulunya adalah UCS-2 , yang merupakan 16-bit panjang tetap yang bagus. Tentu saja, 16bit ternyata tidak cukup. Mereka memasang UTF-16 di atas.

DeadMG
sumber
6
Berikut adalah kutipan dari FAQ Unicode : Originally, Unicode was designed as a pure 16-bit encoding, aimed at representing all modern scripts. (Ancient scripts were to be represented with private-use characters.) Over time, and especially after the addition of over 14,500 composite characters for compatibility with legacy sets, it became clear that 16-bits were not sufficient for the user community. Out of this arose UTF-16.Pada saat rilis Java UTF-16 belum muncul, dan UTF-8 bukan bagian dari standar Unicode.
Malcolm
20
UCS-2 adalah istilah teknis, bukan kata kunci.
DeadMG
14

Untuk bagian utama, demi pemeriksaan masa depan yang sederhana dan sederhana. Apakah itu alasan yang salah arah dan cara yang salah untuk melakukannya adalah pertanyaan yang berbeda.

Anda dapat melihat beberapa alasan di balik beberapa keputusan desain mereka dalam dokumen ini tentang peralihan 2004 ke Java 5 dan UTF-16, yang menjelaskan beberapa kekurangannya juga: Karakter Tambahan dalam Platform Java , dan lihat Mengapa ekosistem Jawa menggunakan pengkodean yang berbeda di seluruh tumpukan mereka? .

Untuk detail lebih lanjut tentang perangkap menggunakan UTF-16, dan mengapa UTF-8 cenderung menjadi pilihan yang lebih baik secara umum, lihat Haruskah UTF-16 dianggap berbahaya? dan manifesto Everywhere UTF-8 .

haylem
sumber
8
+1 untuk ditautkan ke "Haruskah UTF-16 dianggap berbahaya?" pertanyaan. Saya baru-baru ini menemukan manifesto Everywhere UTF-8 dan saya percaya saya sekarang cukup yakin. Untuk apa nilainya, meskipun Java salah, saya cukup yakin bahwa Windows melakukan jauh lebih buruk.
Daniel Pryden
5
Yah, itu tidak mengherankan bahwa Windows lebih salah : Mereka membuat beralih ke Unicode sebelumnya, sehingga mereka memiliki lebih sedikit pilihan yang benar dan lebih sedikit pengalaman. Java punya nanti, lebih benar , tapi masih agak salah. Sekarang keduanya harus hidup dengan API lama, yang salah dalam pengertian umum yang harus terus mereka dukung.
Joachim Sauer
4
Itulah kehidupan di dunia perangkat lunak, Anda harus membuat pilihan tanpa memiliki semua data, dan ketika Anda salah, Anda bisa hidup dengan konsekuensi untuk waktu yang lama. :-)
Brian Knoblauch
2
Saya bertanya-tanya apa implikasi kinerja akan membuat stringtipe "khusus" di Jawa (seperti Arrayini), daripada Stringmenjadi kelas "biasa" yang memiliki referensi ke array "biasa" yang berisi karakter aktual. Bergantung pada bagaimana string dihasilkan, UTF-8, UTF-16, atau bahkan UTF-32 mungkin merupakan cara paling efisien untuk menyimpannya. Saya tidak berpikir ada cara yang sangat efisien untuk kelas "biasa" Stringuntuk menangani banyak format, tetapi tipe "khusus" dengan dukungan JVM bisa.
supercat
@ supercat: Saya tidak punya jawaban yang pasti untuk itu, tapi saya punya jawaban SO terkait untuk itu. :) Tidak benar-benar membahas pendekatan tipe khusus, tetapi membahas potensi keuntungan dari memiliki string yang efisien.
haylem