Я собираюсь спросить, что, вероятно, является довольно спорным вопросом: «Следует ли считать одну из самых популярных кодировок, UTF-16, вредной?»
Почему я задаю этот вопрос?
Сколько программистов знают о том факте, что UTF-16 на самом деле является кодировкой переменной длины? Под этим я подразумеваю, что существуют кодовые точки, которые, представленные в виде суррогатных пар, занимают более одного элемента.
Я знаю; Многие приложения, инфраструктуры и API используют UTF-16, такие как Java String, C # String, Win32 API, библиотеки Qt GUI, библиотека ICU Unicode и т. д. Однако, при всем этом, в обработке есть много основных ошибок символов вне BMP (символы, которые должны быть закодированы с использованием двух элементов UTF-16).
Например, попробуйте отредактировать один из этих символов:
- 𝄞 ( U + 1D11E ) МУЗЫКАЛЬНЫЙ СИМВОЛ G CLEF
- 𝕥 ( U + 1D565 ) МАТЕМАТИЧЕСКАЯ ДВОЙНАЯ СТРУКТУРА МАЛЫЙ T
- 𝟶 ( U + 1D7F6 ) МАТЕМАТИЧЕСКИЙ МОНОМЕРНЫЙ ЦИФРОВОЙ НОЛЬ
- 𠂊 ( U + 2008A ) Хан Персонаж
Вы можете пропустить некоторые, в зависимости от того, какие шрифты вы установили. Все эти персонажи находятся за пределами BMP (базовая многоязычная плоскость). Если вы не видите эти символы, вы также можете попробовать посмотреть их в справочнике символов Unicode .
Например, попробуйте создать имена файлов в Windows, которые включают эти символы; попробуйте удалить эти символы с помощью «backspace», чтобы увидеть, как они ведут себя в разных приложениях, использующих UTF-16. Я сделал несколько тестов, и результаты довольно плохие:
- Опера имеет проблемы с их редактированием (удалите 2 нажатия на клавишу возврата)
- Блокнот не может справиться с ними правильно (удалите необходимые 2 нажатия на клавишу возврата)
- Редактирование имен файлов в диалоговых окнах не работает (необходимо удалить 2 нажатия на клавишу возврата)
- Все приложения QT3 не могут справиться с ними - показывать два пустых квадрата вместо одного символа.
- Python неправильно кодирует такие символы при использовании непосредственно
u'X'!=unicode('X','utf-16')
на некоторых платформах, когда символ X находится за пределами BMP. - Unicodedata в Python 2.5 не может получить свойства для таких символов, когда python скомпилирован со строками Unicode UTF-16.
- Похоже, что StackOverflow удаляет эти символы из текста, если редактируется непосредственно как символы Юникода (эти символы отображаются с использованием экранирования HTML в Юникоде).
- WinForms TextBox может генерировать недопустимую строку при ограничении MaxLength.
Кажется, что такие ошибки чрезвычайно легко найти во многих приложениях, использующих UTF-16.
Итак ... Как вы думаете, что UTF-16 следует считать вредным?