Ich werde fragen, was wahrscheinlich eine ziemlich kontroverse Frage ist: "Sollte eine der beliebtesten Kodierungen, UTF-16, als schädlich angesehen werden?"
Warum stelle ich diese Frage?
Wie vielen Programmierern ist bekannt, dass UTF-16 tatsächlich eine Kodierung mit variabler Länge ist? Damit meine ich, dass es Codepunkte gibt, die als Ersatzpaare dargestellt werden und mehr als ein Element enthalten.
Ich weiß; Viele Anwendungen, Frameworks und APIs verwenden UTF-16, z. B. Javas String, C # -String, Win32-APIs, Qt-GUI-Bibliotheken, die ICU-Unicode-Bibliothek usw. Bei alledem treten jedoch viele grundlegende Fehler in der Verarbeitung auf von Zeichen aus BMP (Zeichen, die mit zwei UTF-16-Elementen codiert werden sollen).
Versuchen Sie beispielsweise, eines dieser Zeichen zu bearbeiten:
- 𝄞 ( U + 1D11E ) MUSIKSYMBOL G CLEF
- 𝕥 ( U + 1D565 ) MATHEMATISCHES DOPPELSTREIFEN KLEINES T
- 𝟶 ( U + 1D7F6 ) MATHEMATISCHE MONOSPACE-DIGIT-NULL
- 𠂊 ( U + 2008A ) Han-Charakter
Je nachdem, welche Schriftarten Sie installiert haben, fehlen möglicherweise einige. Diese Zeichen befinden sich alle außerhalb des BMP (Basic Multilingual Plane). Wenn Sie diese Zeichen nicht sehen können, können Sie sie auch in der Unicode-Zeichenreferenz anzeigen .
Versuchen Sie beispielsweise, in Windows Dateinamen zu erstellen, die diese Zeichen enthalten. Versuchen Sie, diese Zeichen mit einem "Backspace" zu löschen, um zu sehen, wie sie sich in verschiedenen Anwendungen verhalten, die UTF-16 verwenden. Ich habe einige Tests gemacht und die Ergebnisse sind ziemlich schlecht:
- Opera hat Probleme beim Bearbeiten (Löschen von 2 Drücken auf die Rücktaste erforderlich)
- Notepad kann nicht richtig mit ihnen umgehen (Löschen von 2 Drücken auf die Rücktaste erforderlich)
- Dateinamenbearbeitung in Fensterdialogen unterbrochen (Löschen erforderlich, 2 x Rücktaste drücken)
- Alle QT3-Anwendungen können damit nicht umgehen - statt eines Symbols werden zwei leere Quadrate angezeigt .
- Python codiert solche Zeichen falsch, wenn sie
u'X'!=unicode('X','utf-16')
auf einigen Plattformen direkt verwendet werden , wenn X ein Zeichen außerhalb von BMP ist. - Python 2.5-Unicodedaten können keine Eigenschaften für solche Zeichen abrufen, wenn Python mit UTF-16-Unicode-Zeichenfolgen kompiliert wird.
- StackOverflow scheint diese Zeichen aus dem Text zu entfernen, wenn sie direkt als Unicode-Zeichen bearbeitet werden (diese Zeichen werden mit HTML-Unicode-Escapezeichen angezeigt).
- WinForms TextBox generiert möglicherweise eine ungültige Zeichenfolge, wenn die Beschränkung auf MaxLength festgelegt ist.
Es scheint, dass solche Fehler in vielen Anwendungen, die UTF-16 verwenden, extrem leicht zu finden sind.
Also ... Glauben Sie, dass UTF-16 als schädlich angesehen werden sollte?