Zadam pytanie, które jest prawdopodobnie dość kontrowersyjnym pytaniem: „Czy jedno z najpopularniejszych kodowań, UTF-16, należy uznać za szkodliwe?”
Dlaczego zadaję to pytanie?
Ilu programistów jest świadomych faktu, że UTF-16 jest tak naprawdę kodowaniem o zmiennej długości? Rozumiem przez to, że istnieją punkty kodowe, reprezentowane jako pary zastępcze, biorą więcej niż jeden element.
Wiem; wiele aplikacji, struktur i interfejsów API korzysta z UTF-16, takich jak String Java, String C #, Win32 API, biblioteki Qt GUI, biblioteka Unicode ICU itp. Jednak przy tym wszystkim jest wiele podstawowych błędów w przetwarzaniu znaków poza BMP (znaki, które powinny być zakodowane przy użyciu dwóch elementów UTF-16).
Na przykład spróbuj edytować jeden z następujących znaków:
- 𝄞 ( U + 1D11E ) SYMBOL MUZYCZNY G CLEF
- 𝕥 ( U + 1D565 ) MATEMATYCZNY DOUBLE-STRUCK MAŁY T.
- 𝟶 ( U + 1D7F6 ) MATEMATYCZNA CYFRA MONOSPACE ZERO
- 𠂊 ( U + 2008A ) Han Character
Możesz przegapić niektóre, w zależności od zainstalowanych czcionek. Wszystkie te postacie znajdują się poza BMP (Basic Multilingual Plane). Jeśli nie widzisz tych znaków, możesz także spróbować spojrzeć na nie w opisie Znaków Unicode .
Na przykład spróbuj utworzyć nazwy plików w systemie Windows zawierające te znaki; spróbuj usunąć te znaki za pomocą „backspace”, aby zobaczyć, jak zachowują się w różnych aplikacjach korzystających z UTF-16. Zrobiłem kilka testów, a wyniki są dość złe:
- Opera ma problem z ich edycją (usuń wymagane 2 naciśnięcia na backspace)
- Notatnik nie radzi sobie z nimi poprawnie (usuń wymagane 2 naciśnięcia na backspace)
- Edycja nazw plików w oknach dialogowych okna w podziale (usuń wymagane 2 naciśnięcia na backspace)
- Wszystkie aplikacje QT3 nie radzą sobie z nimi - pokazują dwa puste kwadraty zamiast jednego symbolu.
- Python koduje takie znaki niepoprawnie, gdy są używane bezpośrednio
u'X'!=unicode('X','utf-16')
na niektórych platformach, gdy znak X poza BMP. - Unicodedata w Pythonie 2.5 nie uzyskuje właściwości takich znaków, gdy Python skompilowany z ciągami znaków Unicode UTF-16.
- StackOverflow wydaje się usuwać te znaki z tekstu, jeśli są edytowane bezpośrednio jako znaki Unicode (znaki te są wyświetlane za pomocą znaków ucieczki Unicode HTML).
- TextFox WinForm może generować niepoprawny ciąg znaków, gdy jest ograniczony przez MaxLength.
Wydaje się, że takie błędy są niezwykle łatwe do znalezienia w wielu aplikacjach korzystających z UTF-16.
Więc ... Czy uważasz, że UTF-16 należy uznać za szkodliwy?