Откуда берутся странные символы
Текстовый файл хранит не буквы, а числа: каждой букве соответствует один или несколько байтов. Таблица, по которой байты превращаются в буквы, называется кодировкой. Если файл записан по одной таблице, а программа читает его по другой, числа остаются теми же, а буквы получаются чужие. Так и возникают кракозябры.
Для кириллицы исторически сложилось несколько таблиц. Windows-1251 использовалась в русскоязычной Windows, CP866 встречалась в старых программах для DOS, KOI8-R была распространена в системах семейства Unix. Современный стандарт — UTF-8, он охватывает практически все языки сразу и используется в большинстве новых программ. Субтитры, созданные много лет назад или в старых программах, нередко записаны в Windows-1251, а проигрыватель на телевизоре или телефоне по умолчанию ожидает UTF-8, и наоборот.
Это не поломка файла: данные на месте, нужно только указать правильную таблицу. Поэтому прежде чем удалять «испорченные» субтитры или искать другие, стоит попробовать открыть тот же файл с другой кодировкой. Необратимым остаётся случай — когда файл уже был сохранён в неподходящей кодировке, и непредставимые символы заменились вопросительными знаками. Тогда вернуть буквы из самого файла нельзя.
По виду искажений можно угадать причину
Разные ошибки дают разные характерные узоры. Если запомнить несколько типичных, подобрать кодировку удаётся с первой попытки. Слово «Привет» в таблице ниже служит примером.
| Что видно на экране | Что произошло | Что выбрать |
|---|---|---|
| Привет | Текст в UTF-8 прочитан как Windows-1251 | UTF-8 |
| Ïðèâåò | Текст в Windows-1251 прочитан как западноевропейская таблица | Windows-1251 |
| ?????? | Буквы потеряны при сохранении в неподходящей кодировке | Взять исходный файл, сохранённый до порчи |
| ромбики со знаком вопроса | Плеер не смог разобрать байты и подставил символ замены | Попробовать другую кодировку |
Закономерности объясняются просто. Каждая русская буква в UTF-8 занимает два байта, и при чтении по Windows-1251 эти два байта дают два чужих символа, поэтому текст «растягивается» вдвое и в нём много пар вида «Р» и «С». В Windows-1251 каждая буква занимает один байт, и при чтении по западноевропейской таблице получаются буквы с диакритикой.
Если картина не похожа ни на один пример, запишите, что именно видите, и попробуйте остальные кодировки по очереди, пока текст не станет читаемым.
Исправление в самом плеере
Быстрее всего действовать так: сменить кодировку в настройках воспроизведения, не трогая файл. Во многих настольных проигрывателях в меню субтитров есть пункт с выбором кодировки, иногда он спрятан в расширенных настройках. Названия пунктов зависят от программы и версии, поэтому ищите слова «субтитры», «кодировка» или «шрифт».
Порядок действий такой:
- Включите субтитры и убедитесь, что они отображаются, пусть и в искажённом виде.
- Откройте настройки субтитров и найдите выбор кодировки или набора символов.
- Выберите UTF-8, затем Windows-1251, если первая попытка не помогла.
- Если текст стал читаемым, запомните выбор: часть программ применяет его ко всем файлам, часть запрашивает заново.
На телевизорах и приставках такой выбор бывает ограничен, а иногда его нет вовсе. В этом случае проще один раз исправить сам файл и дальше пользоваться им на любом устройстве. Для мобильных проигрывателей порядок обычно тот же: ищите настройку кодировки в разделе субтитров. Иногда помогает также смена шрифта субтитров: если выбранный шрифт не содержит кириллицы, вместо русских букв отображаются пустые квадраты, хотя кодировка выбрана верно. Это отдельная причина, и она лечится настройкой шрифта, а не пересохранением файла.
Исправление файла: пересохранение в UTF-8
Пересохранение подходит для домашнего архива: файл будет одинаково открываться везде, где поддерживается UTF-8. Для работы достаточно обычного текстового редактора, и описание годится для большинства из них.
- Сначала сделайте копию файла субтитров. Исходный вариант пригодится, если выбрана неверная кодировка.
- Откройте файл в текстовом редакторе, который позволяет выбирать кодировку при открытии. В стандартном Блокноте Windows кодировка выбирается в окне открытия файла, а при сохранении — в окне «Сохранить как».
- Откройте файл с предположительной кодировкой (чаще всего Windows-1251) и убедитесь, что русский текст читается.
- Выберите «Сохранить как» и укажите кодировку UTF-8. Если в списке есть два варианта, с пометкой BOM и без неё, можно попробовать оба: часть старых проигрывателей лучше работает с одним из них, а современные принимают оба.
- Не меняйте расширение файла и оставьте имя таким же, как у видео.
Для большого количества файлов подойдёт пакетное преобразование командами системы или специальными программами, но тогда сначала проверьте результат на одном файле, а уже потом запускайте обработку всей папки.
Если дело не в кодировке
Не все проблемы с субтитрами связаны с таблицей символов. Прежде чем менять кодировку, проверьте другие причины.
- Субтитры не появляются вовсе. Внешний файл должен лежать рядом с видео и называться так же, отличаться должно только расширение: film.mp4 и film.srt. Часть устройств не подхватывает файл, если имя содержит лишние символы.
- Текст отображается, но смещён по времени. Это проблема тайминга, а не кодировки. Многие проигрыватели позволяют сдвигать субтитры горячими клавишами, а в редакторах можно сдвинуть весь файл на заданное время.
- Субтитры встроены в видео картинкой. Графические субтитры редактировать как текст нельзя: они хранятся как изображения, и кодировка к ним не относится.
- Оформление пропало. Формат ASS допускает шрифты, цвета и положение, а простой SRT хранит почти только текст. При конвертации между ними оформление теряется.
О различиях между контейнерами и дорожками внутри видеофайла рассказывает отдельная страница. А если файл сам не открывается на телевизоре, вероятнее всего причина в кодеке или файловой системе флешки, и порядок проверки вынесен в соседний материал.