Материал породил активную дискуссию, и мы решили разобраться в ситуации, рассмотреть аргументы ИТ-экспертов — в том числе инженеров IBM и специалистов консорциума W3C.
Фото — Raphael Schaller — Unsplash
Ситуация с кодировками
В 1988 году Джо Беккер (Joseph Becker) представил первый драфт стандарта Unicode. В основу документа легло предположение, что для хранения любого символа хватит 16 бит. Однако довольно быстро стало понятно, что этого недостаточно. Поэтому появились новые варианты кодировок — в том числе UTF-8 и UTF-16. Но разнообразие форматов и отсутствие строгих рекомендаций по их использованию привело к сумятице в ИТ-индустрии (в том числе в терминологии).
Внутренний формат ОС Windows — это UTF-16. При этом авторы манифеста, обсуждение которого велось на Hacker News, говорят, что одно время в Microsoft упоминали термины Unicode и widechar в качестве синонимов для UTF-16 и UCS-2 (которая считается своеобразным предшественником UTF-16). Что касается экосистемы Linux, то в ней принято использовать UTF-8. Многообразие кодировок порой приводит к тому, что файлы повреждаются при передаче между компьютерами с различными ОС.
Решением проблемы может стать стандартизация отрасли — переход на UTF-8 для хранения текстовых строк в памяти или на диске и обмена пакетами по сети.
Почему UTF-8 считают лучше UTF-16
Один из главных аргументов связан с тем, что UTF-8 сокращает объем памяти, занимаемый символами на латинице (их использует множество языков программирования). Латинские буквы, цифры и распространенные знаки препинания кодируются в UTF-8 лишь одним байтом. При этом их коды соответствует кодам в ASCII, что дает обратную совместимость.
Также специалисты из IBM говорят, что UTF-8 лучше подходит для взаимодействия с системами, не ожидающими прихода многобайтных данных. Другие кодировки юникода содержат многочисленные нулевые байты. Утилиты могут посчитать их концом файла. Например, в UTF-16 символ A выглядит так: 00000000 01000001. В строке Си эта последовательность может быть обрезана. В случае с UTF-8 нулем является только NUL. В этой кодировке первая буква латинского алфавита представлена как 01000001 — здесь проблем с непредвиденным обрывом не возникает.
По этой же причине инженеры из консорциума W3C рекомендуют использовать UTF-8 при разработке внешних интерфейсов. Так можно избежать сложностей с работой сетевых устройств.
Фото — Kristian Strand — Unsplash
Резидент Hacker News отметил, что UTF-8 позволяет отлавливать ошибки кодирования на ранних этапах. В ней байты читаются последовательно, а служебные биты определяют их количество. Таким образом, значение кодовой точки (code point) вычисляется однозначно и разработчикам приложений не нужно задумываться о проблеме Little-Endian или Big-Endian.
Где у UTF-16 преимущество
Буквы латинского алфавита и символы пунктуации могут занимать меньше памяти в UTF-8 (по сравнению с UTF-16). Некоторым кодовым точкам требуется одинаковое количество байтов в обеих кодировках — например, этот факт справедлив для греческого языка и иврита.
Иначе обстоят дела с азиатскими иероглифами — в случае с UTF-8 им нужно больше места. Например, китайский символ ? будет представлен тремя байтами: 11101000 10101010 10011110. Этот же символ в UTF-16 будет выглядеть как 10001010 10011110.
Что в итоге
Дебаты, касающиеся проблемы внедрения единой кодировки, идут уже давно. Этот вопрос поднимался почти одиннадцать лет назад в треде на Stack Overflow. В нем принимал участие Павел Радзивиловский (Pavel Radzivilovsky) — один из авторов манифеста. С тех пор UTF-8 уже успела стать одной из самых популярных кодировок в интернете. И её признали обязательной для «всех ситуаций» в WHATWG — сообществе специалистов по HTML и API, развивающем соответствующие стандарты.
С недавних пор в Microsoft тоже начали рекомендовать использовать UTF-8 при разработке веб-приложений. Возможно, в будущем эта практика распространится на другие утилиты.
Что еще мы публикуем:
«Прячь www»: почему разработчики мейнстрим-браузера снова отказались от отображения поддомена
«Как мы строим IaaS»: материалы о работе 1cloud
Ситуация: нарушают ли AdTech-компании GDPR?
Эра 10-нм чипов — что ждет индустрию в будущем
Компьютер, который отказывается умирать
EnterSandman
яЙНКЭЙН КЕР ОПНЬКН, Ю ЯОНП МХЙЮЙ МЕ ГЮЙНМВХРЯЪ
FSA
Да вроде никто и не спорит. Везде UTF-8 стандарт в интернете, предлагают просто расширить применение.
rjhdby
Почему-то вспомнилось "МЕЯ ВИДО?"
zetroot
ет.
bopoh13
Интересная была задумка с кодировками КОИ-8, но сегодня проблем со шрифтами нет.
sparhawk
А я думал, она не из-за шрифтов применялась. А из-за того, что при пересылки по модему 8 бит могли обрезаться до 7, т.е. КОИ-8 превращался в ASCII
DistortNeo
Мне, кстати, всегда было интересно, почему в пару V поставили Ж, а в пару W — В, ведь логичнее наоборот.
ptica_filin
Это сделали ещё в 19-м веке для телеграфа. А потом постепенно перекочевало и в КОИ-8.
Сейчас концов уже не найти наверное)
Но наверное, для пары W — В есть логичная версия. В немецком языке именно буква «w» читается как «в». (В то время российские технари больше ориентировались на немецкий, а не английский).
А «v» читается как «ф». Может, её по остаточному принципу привязали к «ж».
Kotofay
Радисты тоже часто заменяют Ж на V.
vitvakatu
В это похоже и причина, в азбуке Морзе одна и та же последовательность соответствует и Ж и V