Je vais demander quelle est probablement une question assez controversée: "Un des encodages les plus populaires, UTF-16, devrait-il être considéré comme dangereux?"
Pourquoi je pose cette question?
Combien de programmeurs sont conscients du fait qu'UTF-16 est en réalité un encodage à longueur variable? J'entends par là qu'il existe des points de code qui, représentés par des paires de substitution, prennent plus d'un élément.
Je connais; De nombreuses applications, infrastructures et API utilisent UTF-16, telles que la chaîne Java, la chaîne C #, les API Win32, les bibliothèques d'interface graphique Qt, la bibliothèque ICU Unicode, etc. Cependant, le traitement comporte de nombreux bogues de caractères hors BMP (caractères qui devraient être codés en utilisant deux éléments UTF-16).
Par exemple, essayez d’éditer l’un de ces caractères:
- 𝄞 ( U + 1D11E ) SYMBOLE MUSICAL G CLEF
- 𝕥 ( U + 1D565 ) MINUSCULE MATHÉMATIQUE AJOURÉE T
- 𝟶 ( U + 1D7F6 ) CHIFFRE MATHÉMATIQUE À MONOSPACE ZÉRO
- 𠂊 ( U + 2008A ) Caractère Han
Il se peut que vous en manquiez, en fonction des polices que vous avez installées. Ces caractères sont tous en dehors du plan BMP (Basic Multilingual Plane). Si vous ne pouvez pas voir ces caractères, vous pouvez également essayer de les regarder dans la référence de caractère Unicode .
Par exemple, essayez de créer des noms de fichiers sous Windows contenant ces caractères. essayez de supprimer ces caractères avec un "retour arrière" pour voir comment ils se comportent dans différentes applications qui utilisent UTF-16. J'ai fait des tests et les résultats sont assez mauvais:
- Opera a des problèmes pour les éditer (effacez les 2 appuis nécessaires sur le retour arrière)
- Le Bloc-notes ne peut pas les traiter correctement (supprimez les 2 appuis requis sur le retour arrière).
- La modification des noms de fichier dans les boîtes de dialogue de la fenêtre est interrompue (supprimer 2 appuis requis sur le retour arrière)
- Toutes les applications QT3 ne peuvent pas les gérer - affichez deux carrés vides au lieu d'un symbole.
- Python n'encode pas correctement ces caractères lorsqu'il est utilisé directement
u'X'!=unicode('X','utf-16')
sur certaines plates-formes lorsque X est un caractère extérieur à BMP. - Python 2.5 unicodedata ne parvient pas à obtenir les propriétés de tels caractères lorsque python est compilé avec des chaînes Unicode UTF-16.
- StackOverflow semble supprimer ces caractères du texte s’il est directement modifié en tant que caractères Unicode (ces caractères sont affichés à l’aide d’échappements HTML Unicode).
- WinForms TextBox peut générer une chaîne non valide lorsqu'il est limité avec MaxLength.
Il semble que ces bogues soient extrêmement faciles à trouver dans de nombreuses applications utilisant UTF-16.
Alors ... Pensez-vous que l'UTF-16 devrait être considéré comme dangereux?