BLUEPRINT studioСтатьи

Кракозябры: почему «Привет» становится «РџСЂРёРІРµС‚»

Кракозябры почти никогда не значат, что файл сломался. Разберём, откуда они берутся, как открыть испорченную выгрузку без потерь и почему из-за той же истории SMS-рассылка обходится дороже, чем вы считали.

Кракозябры: почему «Привет» становится «РџСЂРёРІРµС‚»

Компьютер не знает букв, он знает числа

Внутри компьютера букв нет. Есть числа. Буква «П» хранится как одно число, «р» как другое, пробел тоже число. Какое число какой букве соответствует, решает таблица. Эту таблицу и называют кодировкой.

Проще всего представить школьный шифр «А = 1, Б = 2, В = 3». Пока вы и ваш друг пользуетесь одним списком, всё читается. Стоит ему взять другой список, где под единицей стоит «Я», и ваша записка превратится в бессмыслицу. Буквы никуда не делись. Потерялась договорённость о том, по какому списку читать.

Ровно это происходит с кракозябрами. Слово «Привет» в современной кодировке UTF-8 хранится двенадцатью числами. Если прочитать те же самые двенадцать чисел по старой таблице Windows-1251, где под каждым числом стоит отдельная буква, получится честное «РџСЂРёРІРµС‚»: двенадцать символов вместо шести.

Кракозябры почти никогда не означают, что данные испортились. Это спор двух программ о том, по какой таблице читать одни и те же числа.

Четыре русские таблицы и хитрость КОИ-8

Латинскому алфавиту хватало одной общей таблицы, ASCII. Для кириллицы свободного места в ней не осталось, и каждая система дописывала вторую половину таблицы по-своему.

В итоге по стране ходили минимум четыре русские кодировки: КОИ-8 в почте и юниксовых системах, своя таблица в DOS, своя в Windows, ещё одна на Маке. Плюс международная ISO 8859-5, которой почти никто не пользовался. Текст, набранный в одной программе, в другой открывался абракадаброй, и это была обычная рабочая ситуация, а не авария.

Самой любопытной из них оказалась КОИ-8.

«Привет», который читается как «pRIWET»

КОИ-8 (расшифровывается как «код обмена информацией, 8 бит») придумали с запасом на плохую связь. Русские буквы в ней расставили не по алфавиту, а в пару к созвучным латинским: П рядом с p, Р рядом с r, В рядом с w. Такое соответствие досталось в наследство от телеграфного кода МТК-2.

Смысл вот в чём. Каждая русская буква отличалась от своей латинской пары ровно одним, восьмым битом. Старые почтовые серверы и каналы связи часто работали с семью битами и этот восьмой бит просто выбрасывали. Русский текст после такой поездки не превращался в мусор, а становился читаемым транслитом с перевёрнутым регистром. «Привет» превращался в pRIWET. Неудобно, но понять можно, а это заметно лучше набора значков.

В июле 1993 года у кодировки появился свой документ, RFC 1489. Он закрепил за ней имя koi8-r, чтобы почтовые программы перестали спорить о названии. Написал его Андрей Чернов из московской команды сети «Релком». Любопытная деталь: в самом документе прямо сказано, что стандартом он не является. КОИ-8 никто не утверждал сверху, она просто стала фактическим стандартом для юниксовых систем и электронной почты на территории бывшего СССР.

UTF-8 набросали на бумажной подложке в закусочной

Настоящее решение нашлось, когда вместо десятков национальных таблиц сделали одну общую, Юникод. В ней больше миллиона возможных позиций, если точно — 1 112 064. Туда одновременно помещаются кириллица, латиница, иероглифы, арабская вязь и эмодзи.

Осталось придумать, как записывать эти номера в файл. Самый популярный способ записи, UTF-8, Кен Томпсон набросал в сентябре 1992 года на бумажной подложке в закусочной в Нью-Джерси, за ужином с Робом Пайком. Сочиняли они не с нуля: их попросили оценить чужое предложение, которое летом того же года подготовил Дейв Проссер из Unix System Laboratories. Дальше Пайк и Томпсон перевели на новую схему свою операционную систему Plan 9, а отраслевой комитет X/Open принял её у себя.

Главный фокус UTF-8 в том, что латиница и цифры занимают в ней один байт и выглядят точно так же, как в старой ASCII, а кириллица занимает два байта. Старые программы не сломались, новые получили все языки мира. Сегодня на UTF-8 работает 99,1 % сайтов, у которых известна кодировка.

Почему кракозябры до сих пор живут в выгрузках из CRM

Скачали выгрузку заказов, открыли, а вместо имён клиентов набор символов. Скорее всего файл в полном порядке: он сохранён в UTF-8, а программа, которая его открыла, по привычке прочитала его как Windows-1251.

Тут важно не сделать хуже. Самая частая ошибка: увидеть кракозябры, поправить пару ячеек и сохранить файл поверх. В этот момент кракозябры перестают быть недоразумением и становятся настоящими данными. Часть букв заменяется на вопросительные знаки, и восстановить их уже неоткуда.

Правильный путь не в том, чтобы пересохранять, а в том, чтобы заново открыть файл, прямо указав кодировку. В Excel это «Данные» → «Из текста/CSV», в окне импорта поле «Источник файла» и значение «65001: Юникод (UTF-8)». Если текст в окне предпросмотра стал читаемым, импортируйте. Если нет, попробуйте Windows-1251: две попытки закрывают почти все случаи.

Почему в русское SMS влезает 70 символов, а не 160

Здесь та же логика упирается в деньги. У SMS жёсткий потолок: 140 байт на сообщение, и он не менялся с девяностых.

Для латиницы придумали компактный алфавит GSM-7, где на символ уходит 7 бит. Отсюда знаменитые 160 символов. Кириллицы в этом алфавите нет, поэтому русский текст уезжает в другую кодировку, UCS-2, а там на каждый символ уходит уже 2 байта. Те же 140 байт делятся пополам, и остаётся 70 символов.

Текст длиннее режется на части. В каждой части 6 байт съедает служебный заголовок, который объясняет телефону, как собрать куски обратно. Поэтому в частях помещается меньше: 153 символа латиницей и 67 кириллицей. Оператор считает деньги за каждую часть, а клиент видит одно сообщение и о вашей арифметике не догадывается.

Отдельная ловушка — эмодзи. Один смайлик в чисто латинском тексте переключает всё сообщение на UCS-2 и урезает его со 160 символов до 70.

Что с этим делать бизнесу

Шесть проверок, каждая занимает несколько минут.

  1. Посчитайте символы в своей SMS-рассылке. Возьмите реальный шаблон напоминания и посчитайте знаки с пробелами. Больше 70 в русском тексте — вы платите минимум за две части. Пример: «Здравствуйте, Иван! Ваш заказ №1234 готов, ждём вас по адресу: ул. Ленина, 5, до 20:00» — это 86 символов и две части. Тот же смысл в 53 символах: «Иван, заказ 1234 готов. Ждём: ул. Ленина, 5, до 20:00». Одна часть и вдвое меньше денег на каждой отправке.
  2. Уберите из рассылок эмодзи и длинные подписи. Смайлик в конце сообщения стоит ровно столько, сколько лишняя часть SMS, умноженная на размер вашей базы.
  3. Не пересохраняйте файлы с кракозябрами. Сначала копия, потом импорт с указанием кодировки. Если сотрудник уже сохранил файл поверх, запрашивайте выгрузку заново, а не чините руками.
  4. Договоритесь о UTF-8 с подрядчиками и сервисами. Обмен файлами, интеграции, выгрузки бухгалтерии. Один пункт в переписке снимает половину будущих вопросов.
  5. Проверьте, объявляет ли ваш сайт кодировку. Служебная строка <meta charset="utf-8"> должна целиком помещаться в первые 1024 байта страницы, иначе браузер начнёт угадывать и может перерисовать её заново. Посмотреть это можно в бесплатной проверке сайта вместе с остальными техническими мелочами.
  6. Не доверяйте кириллице в QR-коде на глаз. По умолчанию в коде лежит западноевропейская таблица, а про UTF-8 сканеру сообщает отдельная служебная пометка, которую понимают не все читалки. Остальные угадывают по байтам и иногда ошибаются, поэтому код с русским текстом стоит проверить настоящим сканером.

Когда проще позвать разработчиков

Разовые кракозябры лечатся правильным импортом. Хуже, когда они приходят каждую неделю: значит, где-то в связке CRM, выгрузок и рассылок кодировка не зафиксирована, и чинить нужно не файл, а обмен данными. Мы шесть лет собираем такие связки и работаем по договору. Если выгрузки приходят абракадаброй, а SMS режутся на части, обсудите проект или напишите на info@blueprint-studio.ru. Посмотрим и честно скажем, есть ли что улучшать.

Источники

Обсудим вашу задачу

Расскажите, что нужно сделать, — предложим решение, этапы и сроки. Если задача решается проще и дешевле, скажем об этом прямо.

Читайте ещё

НаукаТехнологии GPS и Эйнштейн: почему навигатор не врёт на километры Спутники GPS не знают о вас ничего, телефон только слушает их сигнал. А чтобы этот сигнал превратился в точку на карте, инженерам пришлось встроить в часы спутников поправку из теории относительности. Читать · 7 минут ТехнологииНаука Почему интернет между континентами идёт по дну океана Данные между материками едут не через космос, а по кабелю толщиной с садовый шланг, который лежит на дне океана. Разберём, как он устроен, кто его рвёт и почему из-за этого ваш сайт может отвечать медленнее. Читать · 6 минут QR-кодыТехнологии Почему порванный QR-код всё равно читается телефоном QR-код можно надорвать, испачкать и закрыть логотипом, а телефон всё равно откроет ссылку. Разбираем, за счёт чего это работает и как напечатать код, который сканируется с первого раза. Читать · 7 минут