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