Удалить BOM из субтитров
Или вставьте текст субтитров
Параметры
BOM — три байта в самом начале файла, которые сообщают, в какой кодировке он записан. Она невидима во всех редакторах и плеерах, не занимает места на экране, и в субтитрах от её добавления или удаления ничего не меняется. О ней заботятся два вида инструментов: Windows-программы для субтитров, которые ставят её по умолчанию, и строгие парсеры в сборочных конвейерах, которые отвергают файл, начинающийся с неё. Эта страница открывает поле в состоянии, названном в её заголовке, так что вы можете переключить его, если ваш файл оказался наоборот. Файл в UTF-16 всегда несёт BOM, иначе читатель не узнает порядок байтов, — запрос на удаление там оставляет её на месте.
В какой частоте кадров считается тайминг. На страницах форматов это то, что нужно MicroDVD: он хранит время в номерах кадров. На страницах частоты кадров это частота, по которой файл был рассчитан, — версия, для которой делались субтитры, — а второе поле страницы принимает частоту видео, с которым вы будете их использовать. Обычные значения: 23,976, 24, 25, 29,97, 30, 50, 59,94 и 60. Ошибка сдвигает весь таймлайн, а на страницах частоты кадров — на коэффициент, а не на фиксированную величину.
BOM — это один символ, U+FEFF, стоящий впереди всего остального в файле; многие инструменты его пишут, а многие не ждут и показывают как короткий блок символов в начале первой реплики, и эта страница снимает отметку, оставляя всё остальное ровно таким, каким нашла. Нужно это там, где файл перестаёт быть текстом для человека и становится входом для программы: сборочные цепочки субтитров, скрипты, читающие первую строку, форматы, у которых первые байты должны быть первым символом первой реплики; и при склейке файлов, потому что отметка в середине склеенного файла — это символ посреди реплики.
Страница не решает за вас ничего другого: номера реплик, таймкоды, текст и переводы строк возвращаются такими, какими вошли, включая CRLF, а файл без отметки возвращается байт в байт. Одна оговорка: файлу UTF-16 отметка нужна структурно — без неё не отличить порядок байтов, поэтому такой файл после этой страницы всё равно уйдёт с отметкой; если её нужно убрать, меняйте кодировку, а не снимайте отметку. Принимаются все двенадцать форматов, ни одна реплика не меняется, и ничего не отправляется на сервер.
Примеры
Помеченный файл, из которого отметку сняли
Вход
1
00:00:01,000 --> 00:00:02,000
The room is dark.
Выход
1
00:00:01,000 --> 00:00:02,000
The room is dark.
Вход начинается с U+FEFF, а выход нет: файлы различаются ровно этим одним символом, и в этом вся операция. В такое состояние файлы обычно попадают из программы субтитров под Windows, а убрать отметку хотят из-за шага сборки или строгого парсера, который смотрит на первые байты, а не на реплики.
Файл Windows: отметка снята, возвраты каретки сохранены
Вход
1
00:00:01,000 --> 00:00:02,000
Marked and Windows.
Выход
1
00:00:01,000 --> 00:00:02,000
Marked and Windows.
Уходит только отметка. Каждый возврат каретки — собственный у файла, и у страницы нет о них мнения: тот, кому нужно поменять и их, идёт на страницу переводов строк, и именно это разделение делает каждую из двух страниц безопасной для файла, который вы не открывали. Ожидаемый текст по-прежнему содержит CRLF в точности как вход.
Файл без отметки, возвращённый байт в байт
Вход
1
00:00:01,000 --> 00:00:02,000
The room is dark.
Выход
1
00:00:01,000 --> 00:00:02,000
The room is dark.
Убирать было нечего, поэтому файл возвращается неизменным — включая отсутствие отметки. Этот случай и ловит реализацию, которая сначала пишет отметку, а потом снимает её, или нормализует файл по дороге: честное прочтение фразы «делать было нечего» — это сам вход, байт в байт, а не его причёсанная версия.
Частые вопросы
Как понять, есть ли в файле субтитров BOM?
Откройте файл в редакторе, который показывает кодировку: файл UTF-8 с отметкой обычно подписан как UTF-8 with BOM, а не просто UTF-8. Если такой возможности нет, посмотрите первые байты в hex-редакторе: файл, начинающийся с EF BB BF, отметку несёт, а файл, начинающийся с первого символа реплики, — нет. Тот же блок символов в начале первой строки — это она, увиденная программой, которая прочитала отметку как три обычных символа.
Почему на файле UTF-16 отметка остаётся после удаления?
Потому что файлу UTF-16 она нужна. UTF-16 хранит каждый символ двумя байтами, и два порядка байтов снаружи выглядят одинаково, поэтому именно отметка говорит читателю, какой порядок перед ним: файл UTF-16 без отметки не прочитать обратно ни этому сайту, ни чему-либо ещё. Страница сохраняет её по этой причине. Чтобы получить файл совсем без отметки, смените кодировку на UTF-8 или Windows-1252, где отметка необязательна.
Портит ли страница файл субтитров, в котором отметки никогда не было?
Нет. Выход в этом случае — сам вход, байт в байт, и ничего о нём не сообщается. Запускать страницу на файле, в состоянии которого вы не уверены, безопасно по той же причине: если отметки нет, писать нечего, а если есть, изменение минимально возможно. Запуск, который ничего не нашёл, — это не запуск, который что-то сделал.
Может ли в файле субтитров быть несколько BOM?
Да, и так бывает всякий раз, когда инструмент добавляет отметку, не проверяя, есть ли она уже: вторая отметка даёт файл, который в редакторе выглядит совершенно нормально, но отличается от обычного в первых байтах. Эта страница снимает все отметки, а не одну, поэтому дважды помеченный файл чистится за один проход, а повторный запуск уже ничего не меняет.
Меняет ли удаление BOM кодировку файла субтитров?
Не в том смысле, который обычно имеют в виду. Текст файла состоит из тех же символов, и остальная его часть закодирована так же; меняется то, что первые байты больше не сообщают читателю кодировку. Файл UTF-8 без отметки — это обычный UTF-8, который большинство инструментов и так предполагает. Смена самой кодировки — отдельная страница, ссылка на неё есть здесь.
Вернётся ли отметка, когда я скачаю файл субтитров?
Нет. Скачивание — это момент записи файла, и запуск этой страницы пишет его без отметки, поэтому вы получаете ровно то, что описывают две панели. Кодировка, в которой записывается файл, сохраняется от чтения, с одним исключением: файл, пришедший как UTF-16, записывается обратно как UTF-16 и сохраняет отметку, потому что эта отметка структурная, а не декоративная.