Muhtemelen tartışmalı bir sorunun ne olduğunu soracağım: “En popüler kodlamalardan biri olan UTF-16 zararlı olarak kabul edilmeli mi?”
Bu soruyu neden soruyorum?
Kaç programcı UTF-16'nın gerçekten değişken uzunluklu bir kodlama olduğunun farkında? Bununla, vekil çiftler olarak temsil edilen, birden fazla element alan kod noktaları olduğunu kastediyorum.
Biliyorum; Java, String, C # 's String, Win32 API, Qt GUI kütüphaneleri, ICU Unicode kütüphanesi, vb. gibi pek çok uygulama, çerçeve ve API kullanılır. BMP dışındaki karakterlerin listesi (iki UTF-16 öğesi kullanılarak kodlanması gereken karakterler).
Örneğin, şu karakterlerden birini düzenlemeyi deneyin:
- 𝄞 ( U + 1D11E ) MÜZİKSEL SEMBOL G CLEF
- 𝕥 ( U + 1D565 ) MATEMATİKSEL ÇİFT KİŞİLİK KÜÇÜK T
- 𝟶 ( U + 1D7F6 ) MATEMATİKSEL MONOSPACE DIGIT ZERO
- 𠂊 ( U + 2008A ) Han Karakteri
Yüklediğiniz yazı tipine bağlı olarak bazılarını kaçırabilirsiniz. Bu karakterlerin tümü BMP'nin (Temel Çok Dilli Düzlem) dışındadır. Bu karakterleri göremiyorsanız, onlara Unicode Karakter referansında bakmayı da deneyebilirsiniz .
Örneğin, Windows'ta bu karakterleri içeren dosya adları oluşturmaya çalışın; UTF-16 kullanan farklı uygulamalarda nasıl davrandıklarını görmek için bu karakterleri "geri al" ile silmeyi deneyin. Bazı testler yaptım ve sonuçlar oldukça kötü:
- Opera’nın düzenleme konusunda problemi var (geri silme işleminde gerekli 2 baskıyı silin)
- Not defteri onlarla doğru şekilde baş edemez (silme işlemi için gerekli 2 basışı silin)
- Pencere diyaloglarında bozuk dosya isimleri bozuk (geri silme işleminde 2 basma gerekli)
- Tüm QT3 uygulamaları onlarla başa çıkamaz - bir sembol yerine iki boş kareyi gösterin .
- Python
u'X'!=unicode('X','utf-16')
, X BMP dışında bir karakterde olduğunda doğrudan bazı platformlarda kullanıldığında bu karakterleri yanlış kodlar . - Python 2.5 unicodedata, python UTF-16 Unicode dizeleriyle derlendiğinde bu tür karakterlerde özellik alamaz.
- StackOverflow, doğrudan Unicode karakterleri olarak düzenlenmişse bu karakterleri metinden kaldırıyor gibi görünmektedir (bu karakterler HTML Unicode çıkışları kullanılarak gösterilmiştir).
- WinForms TextBox, MaxLength ile sınırlı olduğunda geçersiz dize oluşturabilir .
UTF-16 kullanan birçok uygulamada bu tür hataların bulunması son derece kolaydır.
Öyleyse ... UTF-16'nın zararlı olarak kabul edilmesi gerektiğini düşünüyor musunuz?