BookTranslator
BookTranslator

Popravite kodiranje SRT titlova bez gubitka izvornog teksta

Dijagnosticirajte izobličeni SRT tekst, razlikujte pogreške dekodiranja od izgubljenih znakova i izradite zasebnu UTF-8 kopiju uz siguran Python alat i ponovljive uzorke.

BookTranslator

BookTranslator Team

10 min čitanja

Ako vaši SRT titlovi prikazuju café umjesto café, nemojte odmah spremati datoteku kao UTF-8. Najprije sačuvajte netaknutu kopiju njezinih bajtova, utvrdite dekodiranje koje daje točne riječi i zapišite provjereni tekst u zasebnu datoteku. Spremanje pogrešnih znakova u novom kodiranju samo trajno čuva te pogrešne znakove.

Važno je razlikovati valjano kodiranje od točnog teksta. U izvornom eksperimentu s dva titla u nastavku, jedna oštećena datoteka prolazi strogu provjeru za UTF-8 i ne sadrži zamjenske znakove. Njezin francuski tekst ipak je pogrešan. Druga prolazi istu provjeru nakon što je šest izvornih znakova zamijenjeno s �.

Ovaj vodič nudi lokalni Python alat za analizu i pretvorbu, izvorne datoteke za preuzimanje i ponovljiv test. Pokriva dijagnostiku na razini datoteke i eksplicitnu pretvorbu — ne automatsko prepoznavanje kodiranja, sinkronizaciju s videom ili obećanje o povratu nepovratno izgubljenih slova.

Najprije utvrdite što je zapravo oštećeno

Nastavak .srt označava format titlova, a ne zajamčeno kodiranje. SRT sadrži brojeve titlova, vremenske oznake, tekst i razdjelnike; zapis o SRT formatu Kongresne knjižnice opisuje ga kao običan tekst bez jedinstvenog standarda kodiranja znakova.

Iskoristite vidljivi simptom kao povod za provjeru, a ne kao gotovu dijagnozu:

Što viditeŠto provjeritiOdgovarajući sljedeći korak
Dijakritički znakovi ili simboli izgledaju pogrešno u jednom programuDaje li ponovno otvaranje netaknute datoteke uz poznato izvorno kodiranje ispravan tekst?Ako da, upotrijebite to eksplicitno dekodiranje prije izvoza nove kopije.
café ostaje u datoteci ispravno pročitanoj kao UTF-8Je li UTF-8 prethodno pogrešno očitan kao neko drugo kodiranje i tako spremljen?Vratite se na izvorne bajtove ili istražite točnu povijest pretvorbe. Ponovno spremanje u UTF-8 nije popravak.
� se pojavljuje na mjestu gdje bi trebalo biti slovo ili simbolJe li U+FFFD doista spremljen u datoteku ili ga trenutni program umeće pri prikazu bajtova koje ne može dekodirati?Pregledajte netaknuti izvor. Spremljeni zamjenski znak ne otkriva koji je bio izvorni znak.
U playeru se prikazuju kvadratići, ali pouzdani uređivač teksta prikazuje ispravne znakoveJesu li temeljni kodni bodovi točni? Učitava li player doista istu datoteku?Prije mijenjanja datoteke provjerite dekodiranje u playeru, pokrivenost fonta znakovima ili postavke renderiranja.

Znakovi i njihovi prikazani oblici dvije su različite stvari. Pythonovo objašnjenje Unicodea razlikuje kodne bodove od glifova koje iscrtava font. Ispravan tekst u uređivaču ukazuje na vjerojatan problem s playerom; to ne dokazuje da će instalacija određenog fonta riješiti problem. Za potrebe ovog članka nije testiran nijedan font niti player.

Napravite sigurnosnu kopiju bajtova, a zatim provjerite dekodiranje

Preuzmite subtitle_encoding.py i smjestite ga pored SRT datoteke koju želite istražiti. Za ove naredbe potrebna je instalacija Pythona 3 bez dodatnih paketa. Lokalne provjere ovdje su provedene s Pythonom 3.14.3 na macOS-u. Ako vaša instalacija na Windowsima koristi Python pokretač, zamijenite py -3 s python3; to okruženje ovdje nije testirano.

Otvorite terminal u toj mapi. U ovim primjerima zamijenite input.srt sa stvarnim nazivom svoje datoteke. Zadržite navodnike oko staza koje sadrže razmake.

Napravite netaknutu kopiju

python3 subtitle_encoding.py backup "input.srt" "original-bytes.srt"

Odredišna datoteka ne smije već postojati. Alat kopira bajtove bez dekodiranja, ponovno iščitava kopiju i ispisuje njezin SHA-256 sažetak. Također odbija izvornu stazu kao odredište. Zadržite ovu sigurnosnu kopiju čak i nakon što stvorite upotrebljive titlove.

Provjerite UTF-8 bez spremanja izmjena

python3 subtitle_encoding.py inspect "original-bytes.srt"

Izvještaj uključuje strict_utf8, utf8_bom, odabrano dekodiranje i—ako dekodiranje uspije—pretpregled teksta te replacement_characters broj. Njezin zadani tekstualni prikaz koristi utf-8-sig, što podržava početni UTF-8 potpis (BOM).

  • strict_utf8: false znači da bajtovi ne prolaze UTF-8 provjeru. To vam ne govori koje je drugo kodiranje ispravno.
  • strict_utf8: true znači da se mogu dekodirati kao UTF-8. To ne znači da su riječi ispravne.
  • Broj zamjena veći od nule znači da je odabrano dekodiranje proizvelo znakove U+FFFD. Istražite ih prije stvaranja nove datoteke.

Inspekcija ispisuje JSON siguran za ASCII kako font terminala ne bi mogao sakriti identitet znaka: \u00e9 znači é, a \ufffd označava zamjenski znak. Da biste detaljno pregledali sumnjivi redak, zatražite njegov fizički broj retka — a ne broj titla (cue number):

python3 subtitle_encoding.py inspect "original-bytes.srt" --encoding cp1252 --line 3

Ovo je test samo za čitanje za Windows-1252, Pythonov kodek cp1252 . Koristite ga kada postavke izvoza ili povijest izvora opravdavaju taj izbor, a ne zato što je ovaj primjer slučajno na francuskom. Izvještaj o retku imenuje svaki znak i prikazuje njegovu kodnu točku; U+20AC je znak za euro.

Odaberite kodiranje na temelju dokaza, a ne na temelju prvog uspješnog pretpregleda

Zatražite od autora datoteke točno kodiranje pri izvozu, provjerite postavke aplikacije iz koje je izvezena ili usporedite s pouzdanim izvornim transkriptom. Provjerite imena s dijakritičkim znakovima, interpunkciju, simbole valuta i reprezentativne retke kroz cijelu datoteku. Ako ne razumijete taj jezik, uspješni dekoder taj pregled ne može napraviti umjesto vas.

„ANSI” nije dovoljno precizan za odabir izvornog kodeka. Niti su Windows-1252 i Latin-1 međusobno zamjenjivi. U priloženom eksperimentu pojedinačni bajt 80 dekodira se u € pod cp1252, ali u kontrolni znak U+0080 pod latin-1. Obje operacije uspijevaju. Samo nam poznati izvor govori što je zapravo bilo predviđeno.

Drugi jezici mogu koristiti različita naslijeđena kodiranja, no sam naziv jezika ne određuje kodiranje. Ako povijest datoteke nije poznata, a moguća očitanja se razlikuju, zaustavite se prije konverzije i pribavite pouzdanije dokaze o izvorniku.

Konvertirajte tek nakon što je izvorni tekst čitljiv

Za izvor koji je potvrđen kao Windows-1252 stvorite zasebnu UTF-8 datoteku:

python3 subtitle_encoding.py convert "original-bytes.srt" "repaired-utf8.srt" --from-encoding cp1252
python3 subtitle_encoding.py inspect "repaired-utf8.srt"

Konverter strogo dekodira cijeli izvor, kodira taj tekst u UTF-8, provjerava vraća li dekodiranje izlaza isti tekst i ponovno čita zapisane bajtove. Ne mijenja brojeve titlova, vremenske oznake, dijaloge, oznake niti završetke redaka. Novi niz bajtova može se razlikovati iako dekodirani tekst ostaje identičan.

Alat namjerno odbija:

  • prebrisati postojeću odredišnu datoteku;
  • nastaviti nakon pogreške pri strogom dekodiranju; ili
  • zapisati tekst koji sadrži U+FFFD, čak i ako je taj znak bio namjeran.

Posljednje je ograničenje konzervativno: ovaj alat ne može odlučiti što je zamjenski znak trebao predstavljati. Njegovo uklanjanje samo kako bi naredba uspjela odbacilo bi dokaze umjesto da obnovi tekst. Pythonova dokumentacija o rukovateljima pogreškama objašnjava zašto se replace i ignore razlikuju od strogog dekodiranja: oni zamjenjuju ili odbacuju problematične podatke. Nijednom od njih nije mjesto u ovom koraku konverzije.

Ako dođe do I/O pogreške, nemojte koristiti neuspjeli izlaz. Može ostati djelomična nova datoteka; zadržite izvornik i upotrijebite novi naziv odredišta za kasniji pokušaj. Potpuno ponašanje i upotreba alata nalaze se u README datoteci za preuzimanje.

Što je s UTF-8 s BOM-om?

UTF-8 BOM je početni niz bajtova EF BB BF. Pythonov utf-8-sig kodek uklanja taj potpis pri dekodiranju i dodaje ga pri kodiranju.

Za potvrđeni UTF-8 izvor s BOM-om upotrijebite --from-encoding utf-8-sig. Alat obično zapisuje UTF-8 bez BOM-a; dodajte --with-bom samo kada to zahtijeva odredišna aplikacija. Promjena BOM-a ne može pretvoriti café u café. Ovaj eksperiment ne utvrđuje kompatibilnost s bilo kojim pojedinačnim reproduktorom, uređivačem ili platformom za prijenos.

Pet malih datoteka pokazuje zašto ispravnost UTF-8 kodiranja nije dovoljna

U eksperimentu se koriste dva u potpunosti samostalno sastavljena francuska titla. Nisu preuzeti iz filma, od klijenta niti iz prevoditeljskog proizvoda:

1
00:00:01,000 --> 00:00:04,000
Émile dit : « Le prix est de 12,50 €. »

2
00:00:05,000 --> 00:00:08,000
Le café est fermé.

Dana 13. rujna 2026. skripta iz standardne biblioteke za Python 3.14.3 generirala je pet bajtovnih prikaza i usporedila svaki s tim poznatim izvorom. Riječ je o determinističkim provjerama bajtova i nizova znakova, a ne o mjerilu kvalitete prijevoda. Spremite povezane datoteke na disk umjesto kopiranja njihova pretpregleda u pregledniku: različiti bajtovi sama su bit ovog eksperimenta.

Primjerak za preuzimanjeBajtoviStrogi UTF-8?Ispravan tekst pri dekodiranju u UTF-8?Spremljen U+FFFD u UTF-8 tekstu
Izvorni UTF-8132DaDa0
Izvorni Windows-1252125NeNe može se dekodirati kao UTF-8; ispravno uz cp1252Nije primjenjivo
Pogrešan dekoder, ponovno spremljeno kao UTF-8147DaNe0
Zamjenski znakovi, ponovno spremljeno kao UTF-8137DaNe6
Ispravno pretvoreni UTF-8132DaDa0

Svaka kopija zadržava ista dva niza vremenskih oznaka. Ispravno pretvorena datoteka bajt-po-bajt je identična UTF-8 originalu. Dvije oštećene UTF-8 datoteke dokazuju nešto uže, ali korisno: ni valjano kodiranje ni nepromijenjene vremenske oznake ne jamče točan tekst titla. Podudaranje vremenskih oznaka također ne govori ništa o tome odgovara li ovaj izmišljeni zapis stvarnom videu.

Kako biste sami reproducirali ovih pet datoteka, preuzmite reproduce.py i pokrenite ga s nazivom direktorija koji još ne postoji:

python3 reproduce.py encoding-experiment

Skripta stvara ogledne datoteke i results.json koji sadrži puni tekst, transformacije, sažetke (hasheve), verziju radnog okruženja i provjere (assertions). Usporedite ga sa zabilježenim rezultatima eksperimenta; vremenska oznaka generiranja će se razlikovati. Skripte i izvorni edukativni materijali uključuju MIT licencu.

Provjere lokalnog pretvarača također su testirale odbijanje prepisivanja postojećeg izlaza, odbijanje nevažeće izvorne putanje, neuspjeh zbog pogrešnog kodeka, odbijanje znaka U+FFFD, očuvanje CRLF-a i eksplicitni BOM izlaz. Te provjere verificiraju ponašanje ovog alata pri radu s datotekama. One ne testiraju prikaz u reproduktoru, usklađenost sa stvarnim medijskim sadržajem niti BookTranslator prijevod.

Ako su neispravni znakovi već spremljeni

Spremljeni mojibake: istražite točnu povijest nastanka

Naša mojibake kopija nastala je poznatim slijedom: izvorni UTF-8 bajtovi dekodirani su kao Windows-1252, a zatim su ti pogrešni znakovi spremljeni kao UTF-8. Rezultat uključuje café i oštećeni niz za znak eura €.

Budući da u ovoj specifičnoj transformaciji nisu izgubljeni bajtovi, skripta za reprodukciju može je poništiti: ponovno kodirati pogrešan tekst putem cp1252, a zatim dekodirati dobivene bajtove kao UTF-8. Skripta provjerava oporavljeni tekst u odnosu na original.

To je dokaz za ovaj specifični poznati lanac, a ne uputa za primjenu univerzalnog postupka „popravka mojibakea” na svaki SRT. Datoteka može sadržavati legitimne znakove, mješovitu povijest izmjena ili tekst koji je već izmijenjen prethodnim pokušajem popravka. Uvijek dajte prednost netaknutom izvorniku i standardnom postupku pretvorbe. Ako vam je preostao samo spremljeni mojibake, sačuvajte ga i utvrdite kako je nastao prije nego što pokušate izvesti obrnutu transformaciju na zasebnoj kopiji.

Spremljeni zamjenski znakovi: nedostajuće slovo tamo nije kodirano

Primjer trajnog gubitka nastao je dekodiranjem Windows-1252 bajtova kao UTF-8 s omogućenom zamjenom, a zatim spremanjem rezultata. Različiti izvorni znakovi pretvorili su se u istu � oznaku. Spremljena oznaka ne sadrži dovoljno informacija za prepoznavanje izvornog znaka koji se nalazio na tom mjestu.

Nemojte to miješati sa samim prikazom � u aplikaciji. Ako su izvorni bajtovi ostali netaknuti, ispravno dekodiranje i dalje može vratiti tekst — kao što to čini za naš Windows-1252 izvor. Pregledajte taj izvor prije nego što proglasite trajni gubitak.

Ako je jedina preostala kopija doista zamijenila nedostajući tekst znakom U+FFFD ili doslovnim upitnicima, ponovno izvezite ili nabavite čist izvor, odnosno provjerite ručnu transkripciju u odnosu na pouzdan materijal. Običan upitnik može biti i legitimna interpunkcija; samo njegovo prisustvo ne dokazuje ništa. Vjerojatna zamjena koju ponudi AI model samo je nagađanje, a ne vraćeni podatak iz datoteke.

Završite s čitljivim izvorom — a ne samo uspješnom naredbom

Prije nego što prihvatite popravljenu datoteku, usporedite reprezentativne riječi i simbole s pouzdanim izvorom, potvrdite da se redovi s indeksima i vremenskim oznakama nisu promijenili te otvorite novu datoteku u aplikaciji koja će je koristiti. Skripta čuva dekodirani tekst; ona nije alat za provjeru SRT sintakse niti test prihvatljivosti reprodukcije.

Ako sada možete čitati titlove i nije vam potreban drugi jezik, posao je završen. Ako trebate praktičan pregled uz videozapis ili daljnje uređivanje, usporedba softvera za titlove objašnjava različite uloge pojedinih alata.

Tek kada je izvorni tekst pouzdan — i stvarno vam je potreban drugi jezik — prijeđite na BookTranslatorov prevoditelj titlova i radni proces AI prevođenja titlova. Popravak kodiranja, prevođenje i pregled konačnog zapisa tretirajte kao zasebne zadatke. Nijedan od njih nije dokaz da su ostali uspjeli.

Povezane objave