Farò una domanda probabilmente controversa: "Una delle codifiche più popolari, UTF-16, dovrebbe essere considerata dannosa?"
Perché faccio questa domanda?
Quanti programmatori sono consapevoli del fatto che UTF-16 è in realtà una codifica a lunghezza variabile? Con questo intendo dire che ci sono punti di codice che, rappresentati come coppie surrogate, accettano più di un elemento.
Lo so; molte applicazioni, framework e API usano UTF-16, come String di Java, String di C #, API Win32, librerie Qt GUI, libreria Unicode ICU, ecc. Tuttavia, nonostante tutto, ci sono molti bug di base nell'elaborazione di caratteri al di fuori di BMP (caratteri che devono essere codificati utilizzando due elementi UTF-16).
Ad esempio, prova a modificare uno di questi caratteri:
- 𝄞 ( U + 1D11E ) SIMBOLO MUSICALE G CLEF
- 𝕥 ( U + 1D565 ) MATEMATICO DOPPIO CAMION PICCOLO T
- 𝟶 ( U + 1D7F6 ) ZERO DI MONOSPACE MATEMATICO
- 𠂊 ( U + 2008A ) Personaggio Han
Potresti perdere alcuni, a seconda dei caratteri che hai installato. Questi personaggi sono tutti al di fuori del BMP (Basic Multilingual Plane). Se non riesci a vedere questi personaggi, puoi anche provare a guardarli nel riferimento Carattere Unicode .
Ad esempio, prova a creare nomi di file in Windows che includano questi caratteri; prova a eliminare questi caratteri con uno "spazio indietro" per vedere come si comportano in diverse applicazioni che usano UTF-16. Ho fatto alcuni test e i risultati sono piuttosto negativi:
- Opera ha problemi con la loro modifica (elimina le 2 pressioni richieste sul backspace)
- Il Blocco note non è in grado di gestirli correttamente (eliminare le 2 pressioni richieste sul backspace)
- Modifica dei nomi dei file nelle finestre di dialogo interrotte (eliminazione delle 2 pressioni richieste sul backspace)
- Tutte le applicazioni QT3 non possono gestirle: mostra due quadrati vuoti invece di un simbolo.
- Python codifica questi caratteri in modo errato se utilizzato direttamente
u'X'!=unicode('X','utf-16')
su alcune piattaforme quando X in carattere al di fuori di BMP. - L'unicodedata di Python 2.5 non riesce a ottenere proprietà su tali caratteri quando python viene compilato con stringhe Unicode UTF-16.
- StackOverflow sembra rimuovere questi caratteri dal testo se modificato direttamente come caratteri Unicode (questi caratteri sono mostrati usando escape Unicode HTML).
- WinForms TextBox può generare una stringa non valida se limitata con MaxLength.
Sembra che tali bug siano estremamente facili da trovare in molte applicazioni che utilizzano UTF-16.
Quindi ... Pensi che UTF-16 debba essere considerato dannoso?