BookTranslator
BookTranslator

Herstel de codering van SRT-ondertitels zonder de originele tekst te verliezen

Stel een diagnose van verminkte SRT-tekst, onderscheid decodeerfouten van verloren tekens en maak een afzonderlijke UTF-8-kopie met een veilige Python-tool en reproduceerbare voorbeelden.

BookTranslator

BookTranslator Team

11 min lezen

Als je SRT-ondertitels café tonen in plaats van café, sla het bestand dan niet meteen op als UTF-8. Bewaar eerst een onaangeroerde kopie van de bytes, achterhaal een decodering die de juiste woorden oplevert en schrijf de gecontroleerde tekst weg naar een afzonderlijk bestand. Het opslaan van de verkeerde tekens in een nieuwe codering zorgt er alleen maar voor dat die foute tekens behouden blijven.

Het cruciale onderscheid zit hem in geldige codering versus correcte tekst. In het onderstaande experiment met twee cues doorstaat het ene beschadigde bestand een strikte UTF-8-controle en bevat het geen vervangende tekens. Toch klopt de Franse tekst nog steeds niet. Een ander bestand doorstaat dezelfde controle nadat zes oorspronkelijke tekens zijn vervangen door �.

Deze handleiding biedt een lokale inspectie- en conversietool in Python, downloadbare bronbestanden en een reproduceerbare test. Het behandelt diagnose op bestandsniveau en expliciete conversie—geen automatische coderingsdetectie, videosynchronisatie of de garantie om ontbrekende letters te herstellen.

Achterhaal eerst wat er werkelijk mis is

De extensie .srt duidt op een ondertitelformaat, niet op een gegarandeerde codering. Een SRT-bestand bevat cue-nummers, tijdstempels, tekst en scheidingstekens; het SRT-formaatoverzicht van de Library of Congress beschrijft het als platte tekst zonder één universele standaard voor tekencodering.

Gebruik het zichtbare symptoom als aanleiding voor nader onderzoek, niet als definitieve diagnose:

Wat je zietWat je moet controlerenDe juiste vervolgstap
Accenten of symbolen worden in één app verkeerd weergegevenLevert het opnieuw openen van het onaangeroerde bestand met de bekende broncodering de juiste tekst op?Zo ja, gebruik die expliciete decodering voordat je een nieuwe kopie exporteert.
café blijft zichtbaar in een bestand dat correct als UTF-8 wordt ingelezenIs UTF-8 eerder verkeerd gelezen als een andere codering en zo opgeslagen?Keer terug naar de oorspronkelijke bytes of onderzoek de exacte conversiegeschiedenis. Opnieuw opslaan als UTF-8 is geen herstel.
� verschijnt waar een letter of symbool hoortIs U+FFFD daadwerkelijk opgeslagen in het bestand, of voegt de huidige app dit in tijdens het weergeven van niet-decodeerbare bytes?Inspecteer de onaangeroerde bron. Een opgeslagen vervangingsteken verklapt niet wat het oorspronkelijke teken was.
Er verschijnen blokjes in de speler, maar een betrouwbare tekstweergave toont de bedoelde tekensZijn de onderliggende codepunten correct? Laadt de speler hetzelfde bestand?Onderzoek de decodering, het lettertypebereik of de weergave-instellingen van de speler voordat je het bestand aanpast.

Tekens en hun weergegeven vormen zijn verschillende dingen. Pythons Unicode-uitleg maakt onderscheid tussen codepunten en door lettertypen gerenderde glyfen. Correcte tekst in een editor maakt een probleem aan de kant van de speler aannemelijk; het bewijst niet dat het installeren van een specifiek lettertype het oplost. Voor dit artikel zijn geen specifieke lettertypen of spelers getest.

Maak een back-up van de bytes en inspecteer vervolgens een decodering

Download subtitle_encoding.py en plaats het naast het SRT-bestand dat je wilt onderzoeken. Deze opdrachten vereisen een bestaande Python 3-installatie en geen extra pakketten. De lokale controles hier gebruikten Python 3.14.3 op macOS. Als je Windows-installatie de Python-launcher gebruikt, vervang dan py -3 door python3; die omgeving is hier niet getest.

Open een terminal in die map. Vervang in deze voorbeelden input.srt door je werkelijke bestandsnaam. Behoud aanhalingstekens rond paden die spaties bevatten.

Maak een onaangeroerde kopie

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

De bestemming mag nog niet bestaan. De tool kopieert bytes zonder ze te decoderen, leest de kopie weer in en meldt de bijbehorende SHA-256-hash. Het weigert ook het bronpad als bestemming. Bewaar deze back-up, zelfs nadat je een bruikbare ondertiteling hebt gemaakt.

Controleer UTF-8 zonder iets op te slaan

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

Het rapport bevat strict_utf8, utf8_bom, de geselecteerde decodering en — als die decodering slaagt — een tekstvoorbeeld en replacement_characters -telling. De standaard tekstweergave gebruikt utf-8-sig, wat overweg kan met een UTF-8-handtekening aan het begin.

  • strict_utf8: false betekent dat de bytes niet slagen voor de UTF-8-controle. Het vertelt je niet welke andere codering wel juist is.
  • strict_utf8: true betekent dat ze als UTF-8 kunnen worden gedecodeerd. Het betekent niet dat de woorden kloppen.
  • Een vervangingstelling groter dan nul betekent dat de geselecteerde decodering U+FFFD-tekens heeft geproduceerd. Onderzoek deze voordat je een nieuw bestand aanmaakt.

Inspectie toont ASCII-veilige JSON, zodat een terminallettertype de identiteit van het teken niet kan verbergen: \u00e9 betekent é, en \ufffd betekent het vervangingsteken. Om een verdachte regel in detail te bekijken, vraag je het fysieke regelnummer op — niet het cue-nummer:

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

Dit is een alleen-lezen test van Windows-1252, Python's cp1252 -codec. Gebruik deze wanneer de exportinstellingen of de herkomst van het bestand die keuze ondersteunen, niet enkel omdat dit voorbeeld toevallig Frans gebruikt. Het regelrapport noemt elk teken en toont het codepunt; U+20AC is het euroteken.

Kies de codering op basis van bewijs, niet op basis van het eerste geslaagde voorbeeld

Vraag de maker van het bestand naar de daadwerkelijke exportcodering, controleer de instellingen van het exporterende programma of vergelijk het met een betrouwbaar origineel transcript. Controleer namen met accenten, leestekens, valutasymbolen en representatieve regels door het hele bestand heen. Als je de taal niet kunt lezen, kan een succesvolle decoder die controle niet voor je uitvoeren.

“ANSI” is niet specifiek genoeg om de broncodec te kiezen. Evenmin zijn Windows-1252 en Latin-1 onderling uitwisselbaar. In het meegeleverde experiment decodeert de enkele byte 80 naar € onder cp1252, maar naar het stuurteken U+0080 onder latin-1. Beide bewerkingen slagen. Alleen de bekende bron laat zien welke de bedoeling is.

Andere talen gebruiken mogelijk andere verouderde coderingen, maar een taalnaam alleen is niet voldoende om deze te bepalen. Als de voorgeschiedenis onbekend is en mogelijke interpretaties niet overeenkomen, stop dan vóór de conversie en zorg eerst voor beter bronmateriaal.

Converteer pas nadat de brontekst leesbaar is

Maak voor een bron waarvan is bevestigd dat deze Windows-1252 is, een afzonderlijk UTF-8-bestand aan:

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

De converter decodeert de volledige bron strikt, codeert die tekst als UTF-8, controleert of het decoderen van de uitvoer dezelfde tekst oplevert en leest de weggeschreven bytes terug. Het programma wijzigt geen cue-nummers, tijdstempels, dialogen, tags of regeleinden. De nieuwe bytereeks kan afwijken, ook al blijft de gedecodeerde tekst identiek.

Het weigert bewust om:

  • een bestaande bestemming te overschrijven;
  • door te gaan na een strikte decodeerfout; of
  • tekst met U+FFFD weg te schrijven, zelfs als dat teken opzettelijk was geplaatst.

De laatste beperking is conservatief: deze tool kan niet bepalen wat een vervangingsteken hoorde voor te stellen. Dit verwijderen om het commando te laten slagen zou bewijsmateriaal weggooien in plaats van tekst herstellen. Pythons documentatie over foutafhandeling legt uit waarom replace en ignore verschillen van strikte decodering: ze vervangen problematische gegevens of gooien deze weg. Geen van beide hoort thuis in deze conversiestap.

Als er een I/O-fout optreedt, gebruik de mislukte uitvoer dan niet. Er kan een gedeeltelijk nieuw bestand achterblijven; bewaar het origineel en gebruik een nieuwe bestemmingsnaam voor een latere poging. De volledige werking en het gebruik van de tool zijn te vinden in de downloadbare README.

Hoe zit het met UTF-8 met BOM?

Een UTF-8 BOM is de voorafgaande bytereeks EF BB BF. Pythons utf-8-sig -codec verwerkt die handtekening bij het decoderen en voegt deze toe bij het coderen.

Gebruik voor een bevestigde UTF-8-bron met een BOM --from-encoding utf-8-sig. De tool schrijft normaal gesproken UTF-8 zonder BOM; voeg --with-bom alleen toe wanneer de vereisten van de ontvangende toepassing daarom vragen. Het wijzigen van een BOM kan café niet veranderen in café. Dit experiment garandeert geen compatibiliteit met een specifieke speler, editor of uploadplatform.

Vijf kleine bestanden laten zien waarom geldige UTF-8 niet voldoende is

Het experiment maakt gebruik van twee volledig zelfgeschreven Franse ondertitelblokken. Ze zijn niet afkomstig uit een film, van een klant of uit een vertaalproduct:

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

Op 13 september 2026 genereerde een script uit de standaardbibliotheek van Python 3.14.3 vijf byterepresentaties en vergeleek deze stuk voor stuk met die bekende bron. Dit zijn deterministische byte- en tekenreekscontroles, geen benchmark voor vertaalkwaliteit. Sla de gekoppelde bestanden op schijf op in plaats van de browserweergave te kopiëren: de verschillende bytes vormen immers de kern van het experiment.

Downloadbaar exemplaarBytesStrikte UTF-8?Juiste tekst bij decodering als UTF-8?Opgeslagen U+FFFD in de UTF-8-tekst
Originele UTF-8132JaJa0
Originele Windows-1252125NeeNiet decodeerbaar als UTF-8; correct onder cp1252Niet van toepassing
Verkeerde decoder, opnieuw opgeslagen als UTF-8147JaNee0
Vervangende tekens, opnieuw opgeslagen als UTF-8137JaNee6
Correct geconverteerde UTF-8132JaJa0

Elke kopie behoudt exact dezelfde twee tijdstempelreeksen. Het correct geconverteerde bestand is byte-voor-byte identiek aan het origineel in UTF-8. De twee beschadigde UTF-8-bestanden bewijzen iets specifiekers maar nuttigs: noch een geldige codering, noch ongewijzigde tijdstempels garanderen dat de ondertiteltekst klopt. Overeenkomende tijdstempels zeggen bovendien niets over de vraag of dit verzonnen spoor aansluit bij een echte video.

Om de vijf bestanden zelf te reproduceren, download je reproduce.py en voer je dit uit met een mapnaam die nog niet bestaat:

python3 reproduce.py encoding-experiment

Het script schrijft de testbestanden en een results.json met de volledige tekst, transformaties, hashes, runtimeversie en controles. Vergelijk dit met de vastgelegde experimentresultaten; de tijdstempel van generatie zal verschillen. De scripts en originele voorbeeldbestanden bevatten een MIT-licentie.

De controles van de lokale converter testten ook de weigering bij bestaande uitvoer, weigering van het bronpad, fouten door een onjuiste codec, weigering van U+FFFD, behoud van CRLF en expliciete BOM-uitvoer. Deze controles verifiëren het bestandsgedrag van deze tool. Ze testen niet de weergave in mediaspelers, de timing bij echte media of de vertaling via BookTranslator.

Als de beschadigde tekens al zijn opgeslagen

Opgeslagen mojibake: onderzoek de exacte geschiedenis

Onze mojibake-kopie volgde een bekende keten: de oorspronkelijke UTF-8-bytes werden gedecodeerd als Windows-1252, waarna die verkeerde tekens als UTF-8 werden opgeslagen. Het resultaat bevat café en de beschadigde euro-reeks €.

Omdat er bij deze specifieke transformatie geen bytes verloren zijn gegaan, kan het reproductiescript dit ongedaan maken: codeer de foute tekst opnieuw via cp1252en decodeer de resulterende bytes vervolgens als UTF-8. Het controleert de herstelde tekst aan de hand van het origineel.

Dat is het bewijs voor deze specifieke keten, geen instructie om een algemene actie voor het 'herstellen van mojibake' op elk SRT-bestand toe te passen. Een bestand kan legitieme tekens bevatten, een gemengde geschiedenis hebben of tekst bevatten die al door een eerdere herstelpoging is gewijzigd. Geef de voorkeur aan de onaangeroerde bron en het reguliere conversiepad. Als alleen de opgeslagen mojibake resteert, bewaar deze dan en stel vast hoe deze is ontstaan voordat je een omgekeerde transformatie op een andere kopie probeert uit te voeren.

Opgeslagen vervangende tekens: de ontbrekende letter is daar niet gecodeerd

Het testbestand met dataverlies is gemaakt door Windows-1252-bytes te decoderen als UTF-8 met vervanging ingeschakeld, en het resultaat vervolgens op te slaan. Verschillende oorspronkelijke tekens werden daardoor dezelfde � -markering. De opgeslagen markering bevat niet genoeg informatie om te achterhalen welk oorspronkelijk teken op die positie stond.

Verwar dit niet met het simpelweg zien � in een app. Zolang de oorspronkelijke bytes onaangeroerd zijn gebleven, kan een correcte decodering de tekst alsnog herstellen—zoals het geval is bij onze Windows-1252-bron. Inspecteer die bron voordat u definitief dataverlies vaststelt.

Als de enige overgebleven kopie ontbrekende tekst daadwerkelijk heeft vervangen door U+FFFD of letterlijke vraagtekens, exporteer of download dan opnieuw een zuivere bron, of controleer een handmatige transcriptie aan de hand van betrouwbaar materiaal. Een gewoon vraagteken kan immers ook legitieme leestekens zijn; de aanwezigheid ervan bewijst op zichzelf niets. Een aannemelijke vervanging door een taalmodel is een gok, geen herstelde bestandsdata.

Eindig met een leesbare bron—niet alleen met een geslaagd commando

Voordat u het herstelde bestand definitief accepteert, vergelijkt u representatieve woorden en symbolen met de betrouwbare bron, controleert u of de cue- en tijdcoderegels ongewijzigd zijn gebleven en opent u het nieuwe bestand in de toepassing waarin u het wilt gaan gebruiken. Het script behoudt gedecodeerde tekst; het is geen SRT-syntaxisvalidator of acceptatietest voor weergave.

Als u de ondertitels nu probleemloos kunt lezen en geen andere taal nodig hebt, is de taak voltooid. Hebt u nog een visuele controle bij de video of verdere bewerkingen nodig, dan zet de vergelijking van ondertitelsoftware de verschillende rollen van tools op een rij.

Pas wanneer de brontekst betrouwbaar is—en u daadwerkelijk een andere taal nodig hebt—stapt u over naar BookTranslator's Subtitle Translator en de workflow voor AI-ondertitelvertaling. Beschouw het herstellen van de codering, het vertalen en het controleren van de uiteindelijke track als afzonderlijke stappen. Het slagen van de ene is geen bewijs dat de andere ook goed zijn gegaan.

Gerelateerde berichten