unicode

Unicode — это кошмар многих разработчиков (и пользователей) по разным, веским причинам. В 1980-х годах лишь немногие люди читали документы на языках, отличных от их родного и английского. Компьютер поддерживает только небольшое количество языков, пользователь для удобства настраивает свой регион на поддержку языков близких стран.

Память и диски были дорогими, все приложения были написаны, чтобы использовать байтовые строки, используя 8-битные кодировки: один байт на символ был хорошим компромиссом. Сегодня с интернетом и глобализацией мы все читаем и обмениваемся документами со всего мира (даже если не все понимаем).

Проблема заключается в том, что документы редко указывают на кодировку, поэтому отображение документа с неправильной кодировкой приводит к хорошо известной проблеме: mojibake. Трудно получить, или еще хуже, угадать кодировку документа. За исключением кодировок семейства UTF (исходящих из стандарта Unicode), для них нет надежного алгоритма.

Мы должны полагаться на статистику, чтобы угадать наиболее вероятное кодирование, которое выполняется большинством интернет-браузеров. Поддержка Unicode операционными системами, языками программирования и библиотеками сильно варьируется. В целом, она является базовой или вообще не существует. Каждая операционная система управляет Unicode по-разному.

Например, Windows хранит имена файлов в формате Unicode, в то время как операционные системы UNIX и BSD используют байты. Смешивание документов, сохраненных в виде байтов, возможно, даже если они используют различные кодировки, но приводит к mojibake. Поскольку библиотеки и программы также игнорируют кодирование и декодирование предупреждений или ошибок, иногда достаточно написать один символ с диакритическим (любой не-ASCII символ), чтобы получить ошибку.

Полная поддержка Unicode является сложной задачей, поскольку кодировка Unicode больше, чем любая другая кодировка. Например, ISO 8859-1 содержит 256 кодовых точек, включая 191 символ, в то время как Unicode версии 6.0 содержит 248 966 присвоенных кодовых точек.

Стандарт Unicode больше, чем просто кодировка: он объясняет также, как отображать символы (например, слева направо для английского языка и справа налево для персидского языка), как нормализовать строку символов (например, предварительно составленные символы против разложенной формы) и т. д.