BookTranslator
BookTranslator

SRT felirat kódolás javítása az eredeti szöveg elvesztése nélkül

Diagnosztizálja a zavaros SRT szöveget, különböztesse meg a dekódolási hibákat az elveszett karakterektől, és készítsen külön UTF-8 másolatot egy biztonságos Python eszközzel és reprodukálható mintákkal.

BookTranslator

BookTranslator Team

10 perc olvasás

Ha az SRT feliratai café-t mutatnak café helyett, ne mentse el azonnal a fájlt UTF-8-ként. Először őrizze meg a bájtok érintetlen másolatát, azonosítson egy olyan dekódolást, amely a helyes szavakat eredményezi, és írja a ellenőrzött szöveget egy külön fájlba. A rossz karakterek mentése új kódolásban megőrzi a rossz karaktereket.

A fontos különbség a érvényes kódolás és a helyes szöveg között van. Az alábbi eredeti kétjelzéses kísérletben az egyik hibás fájl átmegy egy szigorú UTF-8 ellenőrzésen, és nem tartalmaz helyettesítő karaktereket. A francia szövege mégis hibás. Egy másik ugyanezen az ellenőrzésen megy át, miután hat eredeti karaktert �-ra cseréltek.

Ez az útmutató egy helyi Python vizsgáló- és konvertáló eszközt, letölthető forrásfájlokat és egy reprodukálható tesztet kínál. Fájlszintű diagnózist és explicit konverziót végez – nem automatikus kódolásfelismerést, videószinkronizálást vagy ígéretet a hiányzó betűk helyreállítására.

Először azonosítsa, mi is tört el valójában

Az .srt kiterjesztés egy felirat formátumot jelöl, nem garantált kódolást. Az SRT jelzésszámokat, időbélyegeket, szöveget és elválasztókat tartalmaz; a Kongresszusi Könyvtár SRT formátum rekordja egyszerű szövegként írja le, egyetlen karakterkódolási szabvány nélkül.

A látható tünetet okként használja a vizsgálatra, ne önmagában diagnózisként:

Amit látMit kell ellenőrizniMegfelelő következő lépés
Az ékezetek vagy szimbólumok hibásnak tűnnek egy alkalmazásbanAz érintetlen fájl újbóli megnyitása az ismert forráskódolással a helyes szöveget eredményezi?Ha igen, használja ezt az explicit dekódolást, mielőtt új másolatot exportál.
A café megmarad egy UTF-8-ként helyesen olvasott fájlbanAz UTF-8-at korábban más kódolásként olvasták félre és mentették el?Térjen vissza az eredeti bájtokhoz, vagy vizsgálja meg a pontos konverziótörténetet. Egy újabb UTF-8 mentés nem javítás.
A � ott jelenik meg, ahol egy betűnek vagy szimbólumnak kellene lennieAz U+FFFD valóban a fájlban van mentve, vagy a jelenlegi alkalmazás szúrja be a dekódolhatatlan bájtok megjelenítése közben?Vizsgálja meg az érintetlen forrást. A mentett helyettesítő karakter nem azonosítja az eredeti karaktert.
Dobozok jelennek meg a lejátszóban, de egy megbízható szövegnézetben a szándékolt karakterek vannakA mögöttes kódpontok helyesek? A lejátszó ugyanazt a fájlt tölti be?Vizsgálja meg a lejátszó dekódolását, betűkészlet-lefedettségét vagy megjelenítési beállításait, mielőtt módosítaná a fájlt.

A karakterek és a megjelenített formáik különböző dolgok. A Python Unicode magyarázata megkülönbözteti a kódpontokat a betűkészlet által megjelenített glyph-ektől. A helyes szöveg egy szerkesztőben valószínűvé teszi a lejátszó oldali problémát; ez nem bizonyítja, hogy egy adott betűkészlet telepítése megoldja. Ehhez a cikkhez nem teszteltek betűkészletet vagy lejátszót.

Készíts biztonsági másolatot a bájtokról, majd vizsgálj meg egy dekódolást

Töltsd le a subtitle_encoding.py fájlt, és helyezd el a vizsgálni kívánt SRT fájl mellé. Ezek a parancsok meglévő Python 3 telepítést igényelnek, további csomagok nélkül. Az itteni helyi ellenőrzések macOS-en, Python 3.14.3-mal készültek. Ha a Windows-telepítésed a Python launchert használja, a python3 helyett írd be, hogy py -3; ezt a környezetet itt nem teszteltük.

Nyiss egy terminált abban a mappában. Ezekben a példákban az input.srt helyére írd a tényleges fájlnevedet. A szóközt tartalmazó elérési utakat tartsd idézőjelek között.

Készíts érintetlen másolatot

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

A célfájl még nem létezhet. Az eszköz dekódolás nélkül másolja a bájtokat, visszaolvassa a másolatot, és kiírja annak SHA-256 hash értékét. A forrás elérési útját célként is elutasítja. Ezt a biztonsági másolatot akkor is őrizd meg, miután elkészítetted a használható feliratot.

Ellenőrizd az UTF-8-at anélkül, hogy bármit mentenél

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

A jelentés tartalmazza a strict_utf8, utf8_bom értékeket, a kiválasztott dekódolást, és—ha az a dekódolás sikeres—egy szöveg-előnézetet és a replacement_characters számát. Az alapértelmezett szövegnézete a utf-8-sig kódolást használja, amely kezeli a kezdő UTF-8 szignatúrát.

  • A strict_utf8: false azt jelenti, hogy a bájtok megbuknak az UTF-8 ellenőrzésen. Ez nem mondja meg, hogy melyik másik kódolás a helyes.
  • A strict_utf8: true azt jelenti, hogy UTF-8-ként dekódolhatók. Ez nem jelenti azt, hogy a szavak helyesek.
  • A nullától eltérő helyettesítésszám azt jelenti, hogy a kiválasztott dekódolás U+FFFD karaktereket eredményezett. Vizsgáld meg őket, mielőtt új fájlt hoznál létre.

A vizsgálat ASCII-biztos JSON-t ír ki, így a terminál betűtípusa nem rejtheti el a karakter azonosságát: a \u00e9 az é-t jelenti, a \ufffd pedig a helyettesítő karaktert. Egy gyanús sor részletes vizsgálatához a fizikai sorszámát kérd—nem a felirat sorszámát:

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

Ez a Windows-1252, Python cp1252 kodekjének csak olvasható tesztje. Akkor használd, ha az exportbeállítások vagy a forrás előzményei alátámasztják ezt a választást, nem azért, mert ez a példa épp franciát használt. A sorjelentés megnevezi az egyes karaktereket, és megmutatja a kódpontjukat; a U+20AC az eurójel.

Bizonyítékok alapján válaszd ki a kódolást, ne az első sikeres előnézet alapján

Kérdezd meg a fájl készítőjétől a tényleges exportkódolást, nézd meg az exportáló alkalmazás beállításait, vagy hasonlítsd össze egy megbízható eredeti átirattal. Vizsgáld át az ékezetes neveket, az írásjeleket, a pénznemjeleket és a fájl egészéből vett reprezentatív sorokat. Ha nem tudod elolvasni a nyelvet, egy sikeres dekódoló nem tudja elvégezni helyetted ezt az ellenőrzést.

Az „ANSI” nem elég pontos a forráskodek kiválasztásához. A Windows-1252 és a Latin-1 sem felcserélhető. A mellékelt kísérletben az egyszeres 80 bájt a cp1252 alatt €-ra dekódolódik, a latin-1 alatt viszont a U+0080 vezérlőkarakterre. Mindkét művelet sikeres. Csak az ismert forrás mondja meg, melyik a szándékolt.

Más nyelvek eltérő örökölt kódolásokat használhatnak, de egy nyelvnév önmagában nem határoz meg egyet sem. Ha az előzmények ismeretlenek, és a lehetséges olvasatok ellentmondanak egymásnak, állj meg az átalakítás előtt, és szerezz jobb forrásbizonyítékot.

Csak akkor alakítsd át, ha a forrásszöveg olvasható

Windows-1252-ként megerősített forrás esetén hozz létre egy külön UTF-8 fájlt:

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

Az átalakító szigorúan dekódolja a teljes forrást, UTF-8-ként kódolja azt a szöveget, ellenőrzi, hogy a kimenet dekódolása ugyanazt a szöveget adja vissza, majd visszaolvassa az írt bájtokat. Nem módosítja a felirat sorszámokat, időbélyegeket, párbeszédeket, címkéket vagy sorelválasztókat. Az új bájtsorozat eltérhet, még akkor is, ha a dekódolt szöveg változatlan marad.

Szándékosan megtagadja a következőket:

  • egy létező célfájl felülírását;
  • a továbbhaladást egy szigorú dekódolási hiba után; vagy
  • az U+FFFD-t tartalmazó szöveg írását, még akkor is, ha az a karakter szándékos volt.

Az utolsó korlátozás óvatos: ez az eszköz nem tudja eldönteni, mit volt hivatott jelenteni egy helyettesítő karakter. Ha eltávolítanánk, hogy a parancs lefusson, azzal bizonyítékot dobnánk el, nem szöveget állítanánk helyre. A Python hibakezelő dokumentációja elmagyarázza, miért különbözik a replace és az ignore a szigorú dekódolástól: helyettesítik vagy eldobják a problémás adatokat. Egyik sem tartozik ebbe az átalakítási lépésbe.

Ha I/O-hiba történik, ne használja a sikertelen kimenetet. Maradhat egy részleges új fájl; őrizze meg az eredetit, és egy későbbi próbálkozáshoz használjon friss célnevet. A teljes eszközviselkedés és használat a letölthető README-ben található.

Mi a helyzet a BOM-mal ellátott UTF-8-cal?

A UTF-8 BOM a kezdő EF BB BF bájtsorozat. A Python utf-8-sig kodekje dekódoláskor elfogyasztja ezt a szignatúrát, kódoláskor pedig hozzáadja.

Megerősített, BOM-mal rendelkező UTF-8 forrás esetén használja a --from-encoding utf-8-sig beállítást. Az eszköz általában BOM nélküli UTF-8-at ír; a --with-bom kapcsolót csak akkor adja hozzá, ha a fogadó alkalmazás követelményei ezt megkívánják. A BOM megváltoztatása nem tudja café-t café-vé alakítani. Ez a kísérlet nem igazolja a kompatibilitást egyetlen konkrét lejátszóval, szerkesztővel vagy feltöltési platformmal sem.

Öt apró fájl mutatja meg, miért nem elég az UTF-8 érvényessége

A kísérlet két, teljes egészében saját szerzésű francia feliratot használ. Ezek nem származnak filmből, ügyféltől vagy fordítási termékből:

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é.

2026. szeptember 13-án egy Python 3.14.3 szabványkönyvtári szkript öt bájt-reprezentációt állított elő, és mindegyiket összehasonlította az ismert forrással. Ezek determinisztikus bájt- és sztringellenőrzések, nem fordítási minőségi benchmark. Mentse le a hivatkozott fájlokat a lemezre, ne a böngészőbeli előnézetüket másolja: a kísérlet lényege éppen a különböző bájtok.

Letölthető másolatBájtokSzigorú UTF-8?Helyes szöveg UTF-8-ként dekódolva?U+FFFD mentve az UTF-8 szövegében
Eredeti UTF-8132IgenIgen0
Eredeti Windows-1252125NemNem dekódolható UTF-8-ként; cp1252 alatt helyesNem alkalmazható
Hibás dekóder, UTF-8-ként újramentve147IgenNem0
Helyettesítő karakterek, UTF-8-ként újramentve137IgenNem6
Helyesen UTF-8-ra konvertált fájl132IgenIgen0

Minden másolat ugyanazt a két időbélyeg-karakterláncot tartalmazza. A helyesen konvertált fájl bájtazonos az eredeti UTF-8-cal. A két sérült UTF-8 fájl szűkebb, de hasznos tanulsággal szolgál: sem az érvényes kódolás, sem a változatlan időbélyegek nem garantálják a helyes felirat szövegét. Az egyező időbélyegek arról sem mondanak semmit, hogy ez a kitalált sáv illeszkedik-e egy valódi videóhoz.

Ha saját magad is elő szeretnéd állítani az öt fájlt, töltsd le a reproduce.py fájlt, és futtasd egy nem létező könyvtárnévvel:

python3 reproduce.py encoding-experiment

A szkript kiírja a tesztfájlokat és egy results.json fájlt, amely tartalmazza a teljes szöveget, az átalakításokat, a hashelt értékeket, a futtatókörnyezet verzióját és az állításokat. Hasonlítsd össze a rögzített kísérleti eredményekkel; a generálás időbélyege eltér majd. A szkriptek és az eredeti oktatófájlok MIT licenc alatt állnak.

A helyi konverter ellenőrzései kiterjedtek a meglévő kimenet visszautasítására, a forrásútvonal visszautasítására, a helytelen kodek hibájára, az U+FFFD visszautasítására, a CRLF megőrzésére és a kifejezett BOM-kimenetre is. Ezek az ellenőrzések az eszköz fájlkezelési viselkedését vizsgálják. Nem tesztelik a lejátszó megjelenítését, a valós média időzítését vagy a BookTranslator fordítását.

Ha a hibás karakterek már mentésre kerültek

Mentett mojibake: vizsgáld meg a pontos előzményeket

A mojibake másolatunk egy ismert láncot követett: az eredeti UTF-8 bájtokat Windows-1252-ként dekódolták, majd ezeket a hibás karaktereket UTF-8-ként mentették. Az eredmény tartalmazza a café szöveget és a törött euró jelsorozatot: €.

Mivel ez az adott átalakítás nem veszített el bájtokat, a reprodukciós szkript vissza tudja fordítani: a hibás szöveget visszakódolja cp1252-en keresztül, majd az így kapott bájtokat UTF-8-ként dekódolja. Ellenőrzi a visszaállított szöveget az eredetivel szemben.

Ez a konkrét ismert láncra vonatkozó bizonyíték, nem pedig utasítás arra, hogy minden SRT-re globális „mojibake-javító” műveletet alkalmazzunk. Egy fájl tartalmazhat legitim karaktereket, kevert előzményeket vagy egy korábbi javítás által már megváltoztatott szöveget. Részesítsd előnyben az érintetlen forrást és a normál konverziós utat. Ha csak a mentett mojibake maradt meg, őrizd meg, és állapítsd meg, hogyan keletkezett, mielőtt egy másik példányon inverz átalakítást kísérelnél meg.

Mentett helyettesítő karakterek: a hiányzó betű nincs ott kódolva

A veszteség-tesztfájl úgy készült, hogy Windows-1252 bájtokat UTF-8-ként dekódoltak helyettesítés engedélyezésével, majd az eredményt mentették. Különböző eredeti karakterek ugyanazzá a � jelölővé váltak. A mentett jelölő nem hordoz elegendő információt ahhoz, hogy azonosítsuk, melyik eredeti karakter állt azon a helyen.

Ne keverd ezt össze azzal, hogy csupán látod a � jelet egy alkalmazásban. Ha az eredeti bájtok érintetlenek maradnak, egy helyes dekódolás még visszaállíthatja a szöveget – ahogy a mi Windows-1252 forrásunk esetében is. Vizsgáld meg a forrást, mielőtt veszteséget állapítanál meg.

Ha az egyetlen megmaradt példányban a hiányzó szöveget ténylegesen U+FFFD vagy szó szerinti kérdőjelek helyettesítik, exportáld újra vagy szerezz be egy tiszta forrást, illetve ellenőrizd a kézi átírást megbízható anyaggal szemben. Egy közönséges kérdőjel is lehet legitim írásjel; puszta jelenléte semmit sem bizonyít. Egy modell hihető helyettesítése találgatás, nem visszaállított fájladat.

Olvasható forrással fejezd be – ne csak egy sikeres paranccsal

Mielőtt elfogadnád a javított fájlt, hasonlítsd össze a reprezentatív szavakat és szimbólumokat a megbízható forrással, ellenőrizd, hogy a felirat- és időbélyeg-sorok nem változtak-e meg, és nyisd meg az új fájlt abban az alkalmazásban, amely használni fogja. A szkript megőrzi a dekódolt szöveget; nem SRT-szintaxis-ellenőrző és nem lejátszási elfogadási teszt.

Ha most már el tudod olvasni a feliratokat, és nincs szükséged más nyelvre, a feladat kész. Ha gyakorlati videóellenőrzésre vagy további szerkesztésre van szükséged, a feliratozószoftver-összehasonlítás elmagyarázza a különböző eszközök szerepét.

Csak amikor a forrásszöveg már megbízható – és ténylegesen szükséged van egy másik nyelvre –, lépj tovább a BookTranslator feliratfordítójára és az AI-feliratfordítási munkafolyamatra. Kezeld a kódolás javítását, a fordítást és a végső sáv megtekintését külön feladatként. Egyik sem bizonyítja, hogy a többi is sikerült.

Kapcsolódó bejegyzések