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.

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át | Mit kell ellenőrizni | Megfelelő következő lépés |
|---|---|---|
| Az ékezetek vagy szimbólumok hibásnak tűnnek egy alkalmazásban | Az é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ájlban | Az 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 lennie | Az 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 vannak | A 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: falseazt 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: trueazt 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ásolat | Bájtok | Szigorú UTF-8? | Helyes szöveg UTF-8-ként dekódolva? | U+FFFD mentve az UTF-8 szövegében |
|---|---|---|---|---|
| Eredeti UTF-8 | 132 | Igen | Igen | 0 |
| Eredeti Windows-1252 | 125 | Nem | Nem dekódolható UTF-8-ként; cp1252 alatt helyes | Nem alkalmazható |
| Hibás dekóder, UTF-8-ként újramentve | 147 | Igen | Nem | 0 |
| Helyettesítő karakterek, UTF-8-ként újramentve | 137 | Igen | Nem | 6 |
| Helyesen UTF-8-ra konvertált fájl | 132 | Igen | Igen | 0 |
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





