Semua yang Anda Tidak Pernah Ingin Tahu tentang Normalisasi Unicode
Normalisasi Kanonik
Unicode mencakup banyak cara untuk menyandikan beberapa karakter, terutama karakter beraksen. Normalisasi kanonik mengubah titik kode menjadi bentuk penyandian kanonik. Poin kode yang dihasilkan akan tampak identik dengan yang asli kecuali ada bug di font atau mesin rendering.
Kapan Harus Digunakan
Karena hasilnya tampak identik, selalu aman untuk menerapkan normalisasi kanonik ke string sebelum menyimpan atau menampilkannya, selama Anda dapat mentoleransi hasilnya agar tidak sedikit demi sedikit identik dengan input.
Normalisasi kanonik datang dalam 2 bentuk: NFD dan NFC. Keduanya setara dalam arti bahwa seseorang dapat mengkonversi antara dua bentuk ini tanpa kehilangan. Membandingkan dua string di bawah NFC akan selalu memberikan hasil yang sama dengan membandingkannya di bawah NFD.
NFD
NFD memiliki karakter sepenuhnya diperluas. Ini adalah bentuk normalisasi yang lebih cepat untuk dihitung, tetapi hasilnya lebih banyak poin kode (yaitu menggunakan lebih banyak ruang).
Jika Anda hanya ingin membandingkan dua string yang belum dinormalisasi, ini adalah bentuk normalisasi yang lebih disukai kecuali Anda tahu Anda membutuhkan normalisasi kompatibilitas.
NFC
NFC menggabungkan kembali poin kode bila memungkinkan setelah menjalankan algoritma NFD. Ini membutuhkan waktu sedikit lebih lama, tetapi menghasilkan string yang lebih pendek.
Normalisasi Kompatibilitas
Unicode juga mencakup banyak karakter yang benar-benar bukan milik, tetapi digunakan dalam rangkaian karakter sebelumnya. Unicode menambahkan ini untuk memungkinkan teks dalam set karakter tersebut diproses sebagai Unicode, dan kemudian dikonversi kembali tanpa kehilangan.
Normalisasi kompatibilitas mengonversi ini ke urutan yang sesuai dari karakter "nyata", dan juga melakukan normalisasi kanonik. Hasil normalisasi kompatibilitas mungkin tidak tampak identik dengan aslinya.
Karakter yang menyertakan informasi pemformatan diganti dengan karakter yang tidak. Misalnya karakter ⁹
dikonversi ke 9
. Lainnya tidak melibatkan perbedaan format. Misalnya karakter angka romawi Ⅸ
dikonversi ke huruf biasa IX
.
Tentunya, setelah transformasi ini dilakukan, tidak mungkin lagi untuk mengubah kembali lossless ke set karakter asli.
Kapan harus digunakan
Konsorsium Unicode menyarankan pemikiran normalisasi kompatibilitas seperti ToUpperCase
transformasi. Ini adalah sesuatu yang mungkin berguna dalam beberapa keadaan, tetapi Anda tidak boleh hanya menerapkannya saja.
Kasing yang bagus akan menjadi mesin pencari karena Anda mungkin ingin mencari yang 9
cocok ⁹
.
Satu hal yang mungkin tidak boleh Anda lakukan adalah menampilkan hasil penerapan normalisasi kompatibilitas kepada pengguna.
NFKC / NFKD
Bentuk normalisasi kompatibilitas datang dalam dua bentuk NFKD dan NFKC. Mereka memiliki hubungan yang sama seperti antara NFD dan C.
Setiap string dalam NFKC secara inheren juga dalam NFC, dan sama untuk NFKD dan NFD. Jadi NFKD(x)=NFD(NFKC(x))
, dan NFKC(x)=NFC(NFKD(x))
, dll.
Kesimpulan
Jika ragu, lakukan normalisasi kanonik. Pilih NFC atau NFD berdasarkan pertukaran ruang / kecepatan yang berlaku, atau berdasarkan apa yang dibutuhkan oleh sesuatu yang Anda inter-operasi.