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

 *Основная статья* :  ***Windows-1251*** 

В стане Microsoft, этой Империи Зла и миллиардов мух, не могли поступить иначе, как создать свою, единственно верную кодировку для рабов своих операционных систем. Так на свет появилась  **CP1251**  (она же  *ANSI* , как её по ошибке называли легионы хомячков). В этой кодировке русские буквы были распиханы по таблице в псевдо-алфавитном порядке, с особым цинизмом и вкраплениями таких нужных символов, как  *©*  и  *™* .

> *Вот так, сынок, выглядит порядок. Все буковки на своих местах. От* А *до* Я *. Почти. Букву* ё *мы, конечно, засунули куда-то в задницу, потому что не царское это дело — точки над* е *ставить. Но в целом — благолепие. Это стандарт, это мощь, это* Windows for Workgroups 3.11 *!* 
> — Билл Гейтс (вероятно)

Адепты секты  *CP1251*  бывают как избравшие её почитатели нового поколения Amiga, так и пользователи Windows, последняя из которых свято уверены, что интернет начинается с иконки синей буквы  *e*  на рабочем столе, а заканчивается кнопкой  *Выключить компьютер* . Для них (на Windows) любой текст, который не открывается в Блокноте с первого раза — это  *вирусы*  или  *происки хакеров* . Они породили миллионы сайтов на FrontPage и Narod.ru, где моdзибакэ цвело пышным цветом, стоило только зайти с неправильной операционной системы. Их девиз:  *Если это не работает, значит, у вас неправильный компьютер* .

### Неразделимая федерация орденов красноглазых рыцарей KOI8

 *Основная статья* :  ***KOI8*** 

Но была и другая сила. Сила, рождённая в мрачных подземельях UNIX-систем, где бородатые админы в свитерах с оленями пили пиво и компилировали ядро. Эти суровые воины света и консоли презирали поделки мелкомягких и все вместе создали свой зоопарк кодировок — семейство  **KOI8**  ( *Код Обмена Информацией, 8-битный* ):

- **-R**  ( *Русский* )

- **-U**  ( *Украинский* )

- **-RU**  ( *Русско-украинский* )

- **-E**  ( *Восточная Европа*  (сербско-македонский))

- **-F**  ( *Fingertip Software*  ( *Программный средний палец* ), ужасный мутант из -R, -U, -RU и -E от натуры CP1251)

- **-CS** ( **2** ) ( *Чехословацкий* )

- **-C**  ( *Старославянский* )

- **-T**  ( *Таджикский* )

Логика у создателей 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**  (или  **CP1125**  по-украински,  **CP1131**  по-белорусски и  **CP855**  по-югославски): Древнее зло, рождённое в недрах MS-DOS. Настоящая, труЪ-кодировка для тех, кто помнит Norton Commander, OS/2 Warp и дискеты на 1.44 МБ. В ней были символы псевдографики для рисования рамочек в консоли, что для олдфага было важнее всех этих ваших букв. Текст в CP866, открытый в Windows, порождал особенно инфернальные моdзибакэ, полные символов типа  *±* ,  *‗*  и  *¬* .

- **ISO-8859-5** : Попытка невидимо спонсированных с-AT&T-ной международных бюрократов из ISO навести порядок, задолго до Гейтса. Показалась провалившейся с оглушительным треском от следов KOI8. Единственно использовался в бывшей Югославии вместо центральноевропейской латиницы,  *ISO-8859-2* , и изначальной пустоты подордена  *KOI8-E* .

- **MacCyrillic** : Особый, элитарный сорт моdзибакэ для владельцев Макинтошей. Эти ребята всегда были  *не такие, как все* , поэтому и кодировка у них была своя, ни с чем не совместимая. Встретить её в дикой природе было сродни встрече с единорогом, но уж если встретил — проклинал всё на свете, ибо ни один онлайн-декодер её толком не знал.

- **RK1048**  ( *СТ РК 1048-2002* ): Близкородственный моdзибакэ CP1251, первая попытка Средней Азии прийти к местному открытому миру через свои «правильные буквы султаната». Один из загадочных экспонатов преждевременной внезапной смерти от Юникода. На местное русское RK1048 не влияет, но у тех может выколупнуться  *Ќазаќ*  (RK1048 как в CP1251) — а себе, как «взаимному мученику» —  *Вучиһ*  (CP1251 как в RK1048).

- **Shift-JIS** ,  **TRON Code**  и  **GB2312** : Протомногобайтовые чудовища из сезона чёрной пелены в странах, где в каждом его творении было выцарапано своё, как имя вождя — от QR-кодов и величайших фотоаппаратов до самой программы «WPS» и игровой приставки с поддержкой исторического расстройства, которым бы позавидовали ещё в Commodore. Будучи созданным с учётом цифровизации таковых шедевров, глобализация позволила, ничем не нуждаясь в пробелах, вписать криптоглифизм  *±Ш¶ЮД©*  («Спасибо» по-японски полуширинной катаканой на Shift-JIS, показанный как CP1251) в сердцах каждого внешнего грека и руса в купеческих блуданиях на торги за бумажные куклы, как интерпретацию причудливо длинной открытки на соответствующем подязыке у торговца.

Каждая смена кодировки при пересылке письма или постинге на форум была как игра в испорченный телефон. Сообщение, написанное в 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, GB2312, SJIS). Каждый байт русского текста воспринимается как отдельный символ из таблицы Unicode, обычно из области латиницы с диакритическими знаками (умлауты, акуты и прочие тильды). Выглядит как попытка пьяного немца написать что-то по-польски.

- **Вопросики в ромбиках** , они же  *replacement character* . Это уже работа самого Unicode. Когда программа при чтении UTF-8 потока встречает последовательность байтов, которая не соответствует правилам (например, оборванный на полуслове двухбайтовый символ), она, чтобы не сойти с ума, заменяет эту ошибку на специальный символ �. Если вы видите текст, состоящий сплошь из этих ромбиков, знайте: тут произошло что-то ужасное. Данные были повреждены безвозвратно. Это цифровая смерть. F.

## Как с этим жить?

Никак. Моdziбакэ — это данность. Это как смерть и налоги. Оно было, есть и будет всегда, пока существует хотя бы две несовместимые системы и хотя бы один криворукий программист, которому лень указать кодировку в HTTP-заголовке.

Конечно, сейчас, в эпоху тотального доминирования UTF-8, старые виды моdziбакэ почти вымерли, как динозавры. Но свято место пусто не бывает. Теперь мы имеем дело с проблемами нормализации (когда буква  *ё*  и  *ё*  с диакритикой — это разные символы), с неправильно настроенными базами данных, которые режут четырёхбайтовые эмодзи, с легаси-системами в банках и госучреждениях, которые до сих пор работают на чём-то, что помнит ещё Брежнева.