Mojibake
Mojibake (превращение, оборотничество знаков) — фундаментальный закон природы, немного предсказуемый и почти всегда неприятный результат столкновения двух и более кодировок в одном отдельно взятом тексте, приводящий к полной или (что ещё хуже) частичной нечитаемости последнего. Для конечного юзера выглядит как пришествие Ктулху на экран его монитора в виде набора бессмысленных, но оттого не менее зловещих кракозябр. Является неотъемлемой частью интернета, его кровью и солью, вечным напоминанием Анонимусу о том, что Вселенная — это хаос, а любой порядок — лишь временная и локальная флуктуация.
Суть[править]
Представь, мой юный друг, что ты — не забитый хикка, а гордый римский легионер по имени Lucius. И вот ты решил нацарапать на стене Колизея сакраментальное SPQR. Ты знаешь, что S — это такая загогулина, P — другая, и так далее. Для тебя это — буквы. Но для раба-каменотёса из Нубии, который говорит на совершенно другом языке и письменности не знает, это просто набор царапин. Он может попытаться их скопировать, но вместо P у него получится что-то похожее на финикийский реш, а вместо Q — изображение его любимого верблюда. Результат немного предсказуем: вместо гордой надписи получится нечто, за что центурион пропишет тебе таких люлей, что лететь ты будешь до самого Рима.
Так вот, Mojibake — это ровно то же самое, только в цифровом мире. Твой компьютер, этот тупой кусок кремния, не знает никаких букв А, Б или Ё. Для него это просто числа. Когда ты нажимаешь на клавиатуре кнопку П, программа-редактор смотрит в специальную шпаргалку — кодовую таблицу — и видит: ага, юзер хочет букву П, в нашей шпаргалке это, скажем, число 207. И сохраняет в файл это число. А когда ты открываешь этот файл, происходит обратный процесс: программа читает число 207, лезет в свою шпаргалку и рисует на экране букву П.
Лулз в том, что этих шпаргалок, этих кодировок, человечество наплодило over 9000. И если ты сохранил текст с одной шпаргалкой, а твой собеседник пытается прочесть его с другой, то происходит неизбежное. Программа твоего собеседника видит в файле число 207, лезет в свою шпаргалку, а там под номером 207 значится, например, символ Ó или, что ещё веселее, какой-нибудь управляющий символ, заставляющий принтер печатать завещание твоего деда. На экране появляется Ололо, СЏ сломался!. Это и есть моdзибакэ. Это — плата за вавилонскую гордыню в эпоху цифровых технологий.
Войны кодировок[править]
В те далёкие, ламповые времена, когда интернеты были маленькими, а трава — зеленее, никто и не думал о глобализации. Каждый удельный князёк-программист городил свою систему, свою архитектуру и, конечно же, свою кодировку. В Пиндостане всем заправлял стандарт ASCII, где было всего 128 символов, которых с лихвой хватало для таких важных вещей, как FUCK, MONEY и HAMBURGER. Но когда до высоких технологий допустили остальное человечество, начался цирк с конями.
Каждая уважающая себя нация захотела видеть на экране свои родные закорючки. Так появились так называемые расширенные кодировки, где вторую, неиспользуемую пиндосами половину таблицы (символы со 128 по 255) каждая страна заполняла своими буквами, как бог на душу положит. И вот тут-то и была зарыта собака, которая впоследствии выросла в чудовищного цифрового Кербера.
Священная Римская Империя Windows-1251[править]
В стане Microsoft, этой Империи Зла и миллиардов мух, не могли поступить иначе, как создать свою, единственно верную кодировку для рабов своих операционных систем. Так на свет появилась CP1251 (она же ANSI, как её по ошибке называли легионы хомячков). В этой кодировке русские буквы были распиханы по таблице в псевдо-алфавитном порядке, с особым цинизмом и вкраплениями таких нужных символов, как © и ™.
Вот так, сынок, выглядит порядок. Все буковки на своих местах. От А до Я. Почти. Букву ё мы, конечно, засунули куда-то в задницу, потому что не царское это дело — точки над е ставить. Но в целом — благолепие. Это стандарт, это мощь, это Windows for Workgroups 3.11!
— Билл Гейтс (вероятно)
Адепты секты CP1251 бывают как избравшие её почитатели нового поколения Amiga, так и пользователи Windows, последняя из которых свято уверены, что интернет начинается с иконки синей буквы e на рабочем столе, а заканчивается кнопкой Выключить компьютер. Для них (на Windows) любой текст, который не открывается в Блокноте с первого раза — это вирусы или происки хакеров. Они породили миллионы сайтов на FrontPage и Narod.ru, где моdзибакэ цвело пышным цветом, стоило только зайти с неправильной операционной системы. Их девиз: Если это не работает, значит, у вас неправильный компьютер.
Орден красноглазых рыцарей KOI8-R[править]
Но была и другая сила. Сила, рождённая в мрачных подземельях UNIX-систем, где бородатые админы в свитерах с оленями пили пиво и компилировали ядро. Эти суровые воины света и консоли презирали поделки мелкомягких и создали свою кодировку — KOI8-R (Код Обмена Информацией, 8-битный, Русский).
Логика у создателей KOI8-R была своя, особенная, юниксоидная. Они расположили русские буквы так, чтобы если убрать восьмой бит (например, при передаче через старое железо, которое понимало только 7-битный ASCII), то русские буквы превращались... в похожие по звучанию латинские! Privet, tovarisch! превращалось в pACKAER, РНБЮПХЫ!. Это считалось невероятно остроумным и практичным решением. Для чего — никто уже не помнит, но гордости было полные штаны.
Ты не поймёшь, юзер. Это не баг, это фича. Это красота и элегантность инженерной мысли. Мы не просто пишем буквы, мы общаемся с духом машины на её языке. А ваши CP1251 — это для секретарш, чтобы в Word'е приказы печатать.
— Бородатый админ, где-то в середине 90-х
Воинство KOI8-R обитало в Фидо, в первых юзнет-конференциях и на серверах, поднятых на списанных VAX'ах. Они презирали виндузятников и их кривую кодировку. Именно конфликт между CP1251 и KOI8-R стал той Великой Схизмой, которая породила 95% всех моdзибакэ в Рунете на рубеже веков. Открытие любого русского сайта в те годы напоминало игру в сапёра: тыкал в ссылку и молился, чтобы браузер угадал кодировку. Если не угадал — получал месиво из Привет, РјРёСЂ! (это Привет, мир! в CP1251, показанный как KOI8-R) или, наоборот, ðÒÉ×ÅÔ, ÍÉÒ! (KOI8-R в CP1251).
Прочие ереси и культы[править]
Конечно, двумя этими титанами дело не ограничивалось. Существовала масса других, менее популярных, но оттого не менее злобных кодировок-ересей.
- CP866: Древнее зло, рождённое в недрах MS-DOS. Настоящая, труЪ-кодировка для тех, кто помнит Norton Commander, OS/2 Warp и дискеты на 1.44 МБ. В ней были символы псевдографики для рисования рамочек в консоли, что для олдфага было важнее всех этих ваших букв. Текст в CP866, открытый в Windows, порождал особенно инфернальные моdзибакэ, полные символов типа ±, ‗ и ¬.
- ISO-8859-5: Попытка международных бюрократов из ISO навести порядок. Показалась провалившейся с оглушительным треском там, где победил KOI8. Единственно используется в бывшей Югославии вместо центральноевропейской латиницы, ISO-8859-2.
- MacCyrillic: Особый, элитарный сорт моdзибакэ для владельцев Макинтошей. Эти ребята всегда были не такие, как все, поэтому и кодировка у них была своя, ни с чем не совместимая. Встретить её в дикой природе было сродни встрече с единорогом, но уж если встретил — проклинал всё на свете, ибо ни один онлайн-декодер её толком не знал.
Каждая смена кодировки при пересылке письма или постинге на форум была как игра в испорченный телефон. Сообщение, написанное в CP866, перекодированное почтовым сервером в KOI8-R, а затем прочитанное в браузере с дефолтной CP1251, превращалось в такой шифр, что все машины Энигма коллективно поперхнулись бы от зависти.
Нашествие Unicode, или Глобалистский Заговор[править]
Казалось, этот карнавал абсурда будет вечным. Но в конце XX века на горизонте появилась новая сила. Сила, которая обещала положить конец войнам, объединить все народы и дать каждому символу в мире — от русской Ж до клинописного знака и эмодзи с баклажаном — свой уникальный номер. Имя этой силе было Unicode.
Поначалу олдфаги отнеслись к этому с подозрением. Единая кодировка для всех? Звучит как коммунизм! — ворчали они. Но постепенно, с приходом интернета в каждый утюг и появлением сайтов на китайском, арабском и хинди, стало ясно, что старые 8-битные кодировки, где можно было уместить только один язык, безнадёжно устарели.
Unicode — это не кодировка, а гигантская таблица символов. А вот для сохранения этого добра в файлы используются разные представления. И самым популярным из них стал UTF-8. Хитрость UTF-8 в том, что символы латиницы и цифры (старый добрый ASCII) он кодирует одним байтом, как и раньше. А вот все остальные символы мира — русские, греческие, японские — кодируются последовательностями из двух, трёх или четырёх байтов.
Это был гениальный ход. UTF-8 был обратно совместим со всем старым софтом, который ничего, кроме ASCII, не знал. Но в то же время он позволял написать на одной странице Привет, 世界, שלום без каких-либо проблем.
Казалось бы, вот он, рай на земле! Конец войнам кодировок! Но не тут-то было.
Двойной удар моdзибакэ[править]
Во-первых, теперь моdзибакэ стало ещё более коварным. Если раньше ты видел на экране полную абракадабру, то теперь мог получить текст, который выглядел почти нормально. Например, текст в CP1251, который по ошибке попытались прочитать как UTF-8. Получалось нечто вроде: Привет. Каждый русский символ превращался в два или три почти латинских символа с диакритикой. Это явление получило название Krakozyabry 2.0 или UTF-8 Mojibake. Оно сбивало с толку ньюфагов, которые не понимали, почему вместо русского текста они видят какой-то псевдо-румынский.
Во-вторых, появилась новая проблема: BOM (Byte Order Mark). Это специальный невидимый символ (U+FEFF) в начале файла, который говорит программе: Эй, я UTF-8, работай со мной правильно!. Проблема в том, что многие старые или криво написанные программы этот BOM не понимали. Они показывали его как мусор в начале текста (например, ), а некоторые PHP-скрипты и вовсе отказывались работать, выдавая загадочные ошибки headers already sent. Война за то, ставить BOM или не ставить, стала новым фронтом в вечной битве за чистоту кода.
Так что Unicode не убил моdзибакэ. Он просто перевёл его на новый уровень, сделал его более изощрённым и коварным. Моdзибакэ мутировало, приспособилось и продолжило своё чёрное дело, доказывая, что стремление человечества к энтропии и бардаку непобедимо.
Анатомия кракозябры: Полевой определитель[править]
За долгие годы наблюдений Анонимус, будучи своего рода цифровым натуралистом, научился различать разные виды моdзибакэ, определять их происхождение и даже предсказывать поведение.
- Классическая кракозябра. Типичный результат битвы CP1251 vs KOI8. Выглядит как случайный набор заглавных и строчных русских букв. ðÒÉ×ÅÔ, ÍÉÒ!. Легко лечится сменой кодировки в браузере, если, конечно, эта функция ещё не выпилена из современных огнелисов и хромов в угоду простоте и минимализму.
- Квадратики обыкновенные. Часто с вопросительными знаками или шестнадцатеричными кодами внутри. Это крик души вашего компьютера. Он говорит вам: Я вижу код символа, но в том шрифте, который ты мне подсунул, такой картинки нет!. Типично для попыток отобразить какие-нибудь японские иероглифы или экзотические символы без установленного шрифта. Не является моdзибакэ в строгом смысле, но выглядит не менее удручающе.
- Романо-германский мутант. Тот самый Привет. Возникает, когда однобайтовую кодировку (CP1251, KOI8-R) пытаются интерпретировать как многобайтовую (UTF-8). Каждый байт русского текста воспринимается как отдельный символ из таблицы Unicode, обычно из области латиницы с диакритическими знаками (умлауты, акуты и прочие тильды). Выглядит как попытка пьяного немца написать что-то по-польски.
- Вопросики в ромбиках, они же replacement character. Это уже работа самого Unicode. Когда программа при чтении UTF-8 потока встречает последовательность байтов, которая не соответствует правилам (например, оборванный на полуслове двухбайтовый символ), она, чтобы не сойти с ума, заменяет эту ошибку на специальный символ �. Если вы видите текст, состоящий сплошь из этих ромбиков, знайте: тут произошло что-то ужасное. Данные были повреждены безвозвратно. Это цифровая смерть. F.
Как с этим жить?[править]
Никак. Моdziбакэ — это данность. Это как смерть и налоги. Оно было, есть и будет всегда, пока существует хотя бы две несовместимые системы и хотя бы один криворукий программист, которому лень указать кодировку в HTTP-заголовке.
Конечно, сейчас, в эпоху тотального доминирования UTF-8, старые виды моdziбакэ почти вымерли, как динозавры. Но свято место пусто не бывает. Теперь мы имеем дело с проблемами нормализации (когда буква ё и ё с диакритикой — это разные символы), с неправильно настроенными базами данных, которые режут четырёхбайтовые эмодзи, с легаси-системами в банках и госучреждениях, которые до сих пор работают на чём-то, что помнит ещё Брежнева.