Kencing hewan peliharaan saya sedang melihat begitu banyak proyek perangkat lunak yang memiliki banyak kode untuk dukungan set karakter. Jangan salah paham, saya semua mendukung kompatibilitas, dan saya senang editor teks membiarkan Anda membuka dan menyimpan file dalam beberapa set karakter. Yang mengganggu saya adalah bagaimana proliferasi pengkodean karakter non-universal diberi label "dukungan Unicode yang tepat" daripada "masalah".
Sebagai contoh, izinkan saya memilih PostgreSQL dan dukungan rangkaian karakternya . Penawaran PostgreSQL dengan dua jenis pengkodean:
- Pengkodean klien: Digunakan dalam komunikasi antara klien dan server.
- Pengkodean server: Digunakan untuk menyimpan teks secara internal dalam database.
Saya bisa mengerti mengapa mendukung banyak pengkodean klien adalah hal yang baik. Ini memungkinkan klien yang tidak beroperasi di UTF-8 untuk berkomunikasi dengan PostgreSQL tanpa perlu melakukan konversi. Apa yang tidak saya dapatkan adalah: mengapa PostgreSQL mendukung beberapa penyandian server ? File basis data (hampir selalu) tidak kompatibel dari satu versi PostgreSQL ke versi berikutnya, jadi kompatibilitas lintas versi bukan masalah di sini.
UTF-8 adalah satu-satunya set karakter standar yang kompatibel dengan ASCII yang dapat menyandikan semua codepoint Unicode (jika saya salah, beri tahu saya). Saya berada di perkemahan bahwa UTF-8 adalah set karakter terbaik , tetapi saya bersedia untuk memasang set karakter universal lainnya seperti UTF-16 dan UTF-32.
Saya percaya semua set karakter non-universal harus ditinggalkan. Apakah ada alasan kuat yang tidak seharusnya mereka lakukan?
sumber
Jawaban:
Karena Anda menyebutkan PostgreSQL, saya dapat mengatakan dengan beberapa otoritas bahwa alasan pembunuh utama mengapa pengkodean sisi-server non-UTF8 didukung dengan detail sedemikian rupa adalah bahwa Jepang membutuhkannya. Rupanya, konversi bolak-balik yang identik antara Unicode dan berbagai pengkodean "warisan" Jepang tidak selalu memungkinkan, dan dalam beberapa kasus tabel konversi bahkan berbeda di antara vendor. Benar-benar membingungkan, tetapi ternyata memang begitu. (Dukungan rangkaian karakter yang luas juga merupakan salah satu alasan mengapa PostgreSQL sangat populer di Jepang.)
Karena kita berbicara tentang sistem basis data, salah satu pekerjaan utama adalah untuk dapat menyimpan dan mengambil data dengan andal, seperti yang didefinisikan oleh pengguna, sehingga konversi kumpulan karakter yang hilang terkadang tidak dapat terbang. Jika Anda berurusan dengan peramban web, katakanlah, di mana yang paling penting adalah apakah hasilnya terlihat OK, maka Anda mungkin bisa lolos dengan mendukung penyandian yang lebih sedikit, tetapi dalam sistem basis data Anda memiliki persyaratan tambahan.
Beberapa alasan lain yang disebutkan dalam jawaban lain juga berlaku sebagai argumen pendukung. Tetapi selama Jepang memveto itu, dukungan pengaturan karakter tidak dapat dikurangi.
sumber
Dua alasan yang jelas: tergantung pada data yang Anda simpan, mengonversi ke format lain bisa memakan waktu dan ruang ekstra. Jika Anda menyimpan 400 megabyte informasi, menggandakan persyaratan penyimpanan bukanlah masalah besar - tetapi jika Anda menyimpan 400 terabyte itu mulai berarti lebih banyak. Mengonversi 400 terabyte data dari (katakanlah) Shift-JIS ke UTF-x bisa memakan sedikit waktu juga.
Ini menjadi sangat sulit jika Anda memiliki (misalnya) jaminan uptime yang mengatakan bahwa basis data akan tersedia untuk semua tetapi, katakanlah, 10 menit dari tahun tertentu, dan Anda memiliki basis data yang diperbarui beberapa ratus kali per detik. Pikiran Anda, masih mungkin untuk mengelola konversi besar dalam situasi seperti itu, tetapi itu bukan sesuatu yang harus dilakukan dengan ringan. Dalam beberapa kasus, mungkin perlu waktu bertahun - tahun perencanaan untuk bersiap-siap untuk konversi semacam itu.
Jika Anda mulai dengan basis data yang (misalnya) hanya mendukung ASCII, mungkin ada alasan bagus untuk berdebat apakah masuk akal untuk menambahkan dukungan untuk semua penyandian tersebut - tetapi jika Anda sudah mendukungnya, ada sedikit keuntungan dari menjatuhkan mendukung mereka.
Perhatikan, khususnya, bahwa Anda mungkin tidak akan mendapatkan apa-apa dengan cara menyederhanakan kode, atau semacamnya. Mereka masih membutuhkan semua rutinitas konversi untuk menangani konversi antara klien dan server. Dengan demikian, menjatuhkan dukungan berarti menjatuhkan satu panggilan fungsi (kecil) di jalur "tulis ke disk" dan "baca dari disk", tetapi sedikit (jika ada yang lain). Jika Anda mendukung bahkan dua penyandian pada disk, Anda bahkan tidak akan memperolehnya - Anda masih memiliki panggilan fungsi di sana, jadi semua yang Anda benar-benar akan lakukan akan membatasi rentang penyandian yang didukung oleh fungsi itu.
Setidaknya jika saya sedang merancang ini, saya mungkin akan menulis inti dari database untuk bekerja di UCS-4, dan kemudian memiliki rutinitas konversi antara inti dan disk, dan antara inti dan pengguna. Saya akan menggunakan set rutin yang sama dalam kedua kasus, jadi rute paling sederhana adalah dengan memungkinkan penyimpanan disk untuk menggunakan set pengkodean yang sama persis seperti yang diizinkan oleh klien.
sumber
Ada beberapa masalah dengan hanya menyimpan UTF-8 di server:
VARCHAR(20)
kolom? Apakah itu 20 byte, atau 20 "karakter" (dan di Unicode, apa itu "karakter" ketika Anda menggabungkan karakter, pengikat dan sebagainya?). Lebih buruk lagi, bagaimana dengan diCHAR(20)
mana ia sebenarnya harus mencadangkan seluruh ruang yang mungkin: Saya percaya pada MySQL, cadangan 4 kali jumlah byte untuk kolom yang dikodekan UTF-8 (jadi 80 byteCHAR(20)
) hanya untuk menangani kasus terburuk.Setelah mengatakan semua itu, saya setuju dengan Anda: penyandian sebelumnya sebagian besar tidak ada gunanya dan Unicode umumnya penyandian terbaik untuk digunakan untuk semua aplikasi baru. Jika saya menulis server database dari awal hari ini, saya hanya akan mendukung Unicode dan tidak mendukung encoding legacy sama sekali.
Perbedaannya adalah bahwa PostgreSQL dan sebagian besar server database lain yang digunakan saat ini ada sebelum Unicode adalah opsi yang layak. Jadi mereka sudah memiliki dukungan untuk pengkodean warisan (mereka bukan warisan pada saat itu, tentu saja) dan tidak ada banyak gunanya merobek semua kode itu karena alasan ideologis.
sumber
Pengkodean non-universal (dan khususnya byte tunggal) memang memiliki tempatnya: Pada sistem yang:
Itu berlaku hari ini untuk beberapa jenis perangkat tertanam. Tetapi di desktop, dan di ruang server, pengkodean non-Unicode sudah lama usang sekarang.
sumber
UTF-8 adalah yang terbaik untuk Anda penutur bahasa Inggris egosentris 1 . Jika Anda orang Jepang, sekitar 99% karakter Anda akan mengambil 3-4 byte, bukan dua di UTF-16.
Dialek non-latin benar-benar menderita UTF-8 pada tingkat ukuran. Jangan lupa bahwa dalam beberapa tahun, sebagian besar klien Anda mungkin orang Cina, dan tulisan China memiliki jutaan karakter. Anda tidak dapat mempertahankannya secara efisien dengan UTF-8.
Kalau tidak, saya benci kalau saya punya dokumen teks yang tidak ada di UTF- sesuatu . Saya akan sering pergi keluar dari jalan saya jika saya perlu memiliki penyandian yang tepat. Dalam buku saya, penyandian non-Unicode sudah mati.
1. Jangan mengambil bagian egosentris secara pribadi. Saya ingin membuat ilustrasi yang penuh warna dan saya tidak sungguh-sungguh.
sumber
Unicode pada dasarnya rusak, dan tidak mungkin diperbaiki. Itu perlu digantikan oleh sesuatu yang lebih baik, sesuatu yang benar-benar universal. Jika ada sesuatu yang perlu ditinggalkan, itu Unicode.
Contoh masalah dengan Unicide:
UTF8 adalah hack yang wajar, tetapi sebagian besar perangkat lunak berbasis UTF16 rusak. Sebagian besar aplikasi Windows yang mendukung Unicode menggunakan UTF16, termasuk OS itu sendiri. Masalah yang paling umum adalah tidak mendukung lebih dari bidang dasar, yaitu karakter multi-kata.
Unifikasi Han adalah bencana yang tak terselesaikan. Tidak mungkin untuk mencampur teks Jepang / Cina / Korea dalam satu dokumen tanpa metadata tambahan, dan sulit untuk mendeteksi font mana yang harus digunakan.
Karakter kombinasi adalah bencana lain. Skema pengodean yang lebih masuk akal memetakan satu karakter ke satu kode, yang membuat string pemrosesan relatif waras. Unicode tidak. Unicode bahkan tidak konsisten - sebagian besar karakter Han adalah kombinasi, tetapi tidak dikodekan seperti itu, sedangkan karakter kombinasional Eropa.
Beberapa nama orang tidak dapat ditulis dengan benar dalam Unicode, atau sangat rentan untuk dirender secara tidak benar karena masalah yang disebutkan di atas. Ini dapat memiliki konsekuensi yang parah, misalnya ketika mencoba naik pesawat dengan paspor yang tidak cocok dengan apa yang (tidak benar) dicetak pada tiket.
Karena masalah ini dan banyak lagi, banyak perangkat lunak non-Inggris tidak dapat menggunakan Unicode dan bergantung pada pengkodean karakter lokal. Ini sangat umum dengan perangkat lunak Jepang dan Cina.
Idealnya, Unicode harus ditinggalkan. Pengodean karakter TRON adalah pengganti Unicode yang cukup bagus, dan sebagian besar kompatibel untuk perangkat lunak yang ada yang tidak akan diperbarui.
sumber
Mungkin untuk menulis, tetapi tidak untuk membaca.
Ada banyak konten yang ada yang menggunakan pengkodean itu, dan beberapa pengkodean seperti base64 tidak pergi ke mana pun karena beberapa protokol teks mengamanatkannya sebagai cara untuk menanamkan data biner.
Masalah sebenarnya adalah deteksi otomatis penyandian yang mengarah ke lubang keamanan. Saya tidak keberatan melihat beberapa penyandian yang tidak jelas seperti UTF-7 hilang begitu saja.
Deteksi otomatis juga cenderung berurusan dengan buruk dengan konten yang dihasilkan oleh string byte yang digabungkan secara naif.
sumber
Saya setuju bahwa pengkodean karakter default untuk database dan aplikasi baru harus semacam varian UTF. Saya pribadi akan memilih UTF-16 karena tampaknya merupakan tradeoff yang wajar pada ruang dan kompleksitas (lebih dari UTF-8). Yang mengatakan, beberapa pengkodean karakter masih masuk akal dalam kasus-kasus tertentu.
Perhatikan bahwa ada 4 algoritma normalisasi UTF standar. Jika Anda khawatir tentang karakter multi-codepoint, Anda dapat menggunakan salah satu dari dua algoritma normalisasi yang menciutkannya menjadi karakter single-codepoint yang setara. Perbedaan antara mereka ada hubungannya dengan kesetaraan logis vs kesetaraan fisik karakter.
sumber