BookTranslator
BookTranslator

Orijinal Metni Kaybetmeden SRT Altyazı Kodlamasını Düzeltme

Bozuk SRT metinlerini analiz edin, kod çözme hatalarını kayıp karakterlerden ayırt edin ve güvenli bir Python aracı ile tekrarlanabilir örnekler üzerinden ayrı bir UTF-8 kopyası oluşturun.

BookTranslator

BookTranslator Team

10 dk okuma

Eğer SRT altyazılarınız café yerine cafégösteriyorsa, dosyayı hemen UTF-8 olarak kaydetmeyin. Öncelikle dosya baytlarının dokunulmamış bir kopyasını saklayın, doğru sözcükleri veren kod çözmeyi belirleyin ve doğrulanmış metni ayrı bir dosyaya yazın. Yanlış karakterleri yeni bir kodlamayla kaydetmek yalnızca bu yanlış karakterleri kalıcı hale getirir.

Buradaki kritik ayrım, geçerli kodlama ile doğru metinarasındaki farktır. Aşağıdaki iki replikli orijinal deneyde, bozuk dosyalardan biri katı bir UTF-8 kontrolünden geçer ve hiçbir değiştirme karakteri içermez. Yine de Fransızca metni yanlıştır. Bir diğeri ise altı orijinal karakter �.

Bu kılavuz yerel bir Python inceleme ve dönüştürme aracı, indirilebilir kaynak dosyalar ve tekrarlanabilir bir test sunar. Otomatik kodlama tespiti, video senkronizasyonu veya kayıp harfleri kurtarma vaadi vermek yerine dosya düzeyinde teşhis ve belirgin dönüştürme işlemlerini ele alır.

Öncelikle asıl neyin bozulduğunu tespit edin

Bir .srt uzantısı belirli bir altyazı formatını gösterir, garanti edilmiş bir karakter kodlamasını değil. SRT; replik numaralarını, zaman damgalarını, metni ve ayırıcıları barındırır; Kongre Kütüphanesi'nin SRT format kaydı bunu tek bir karakter kodlaması standardı olmayan düz metin olarak tanımlar.

Görünen belirtiyi tek başına bir teşhis olarak değil, araştırmaya başlamak için bir neden olarak değerlendirin:

Gördüğünüz durumKontrol edilmesi gerekenlerUygun sonraki adım
Aksanlar veya semboller bir uygulamada yanlış görünüyorDokunulmamış dosyayı bilinen kaynak kodlamayla yeniden açmak doğru metni veriyor mu?Yanıt evet ise, yeni bir kopya dışa aktarmadan önce bu belirgin kod çözmeyi kullanın.
café karakteri, UTF-8 olarak doğru okunan bir dosyada kalmaya devam ediyorUTF-8 daha önce başka bir kodlama olarak yanlış okunup kaydedilmiş olabilir mi?Orijinal baytlara dönün veya dönüştürme geçmişini tam olarak inceleyin. Dosyayı yeniden UTF-8 olarak kaydetmek bir onarım değildir.
� bir harf veya sembolün olması gereken yerde görünüyorU+FFFD gerçekten dosyanın içine mi kaydedilmiş, yoksa mevcut uygulama kodu çözülemeyen baytları görüntülerken bunu kendisi mi ekliyor?Değiştirilmemiş kaynak dosyayı inceleyin. Dosyaya kaydedilmiş bir yerine koyma karakteri orijinal karakterin ne olduğunu göstermez.
Oynatıcıda kutucuklar görünüyor, ancak güvenilir bir metin görüntüleyicide amaçlanan karakterler yer alıyorTemeldeki kod noktaları (code points) doğru mu? Oynatıcı aynı dosyayı mı yüklüyor?Dosyayı değiştirmeden önce oynatıcının kod çözme, yazı tipi kapsamı veya görselleştirme ayarlarını inceleyin.

Karakterler ile bunların ekrandaki şekilleri farklı şeylerdir. Python'ın Unicode açıklaması kod noktalarını yazı tipiyle işlenen gliflerden ayırır. Bir düzenleyicide metnin doğru görünmesi, sorunun oynatıcı tarafında olma olasılığını güçlendirir; ancak belirli bir yazı tipini yüklemenin sorunu çözeceğini kanıtlamaz. Bu makale için hiçbir yazı tipi veya oynatıcı test edilmemiştir.

Baytları yedekleyin, ardından kod çözmeyi inceleyin

Şunu indirin: subtitle_encoding.py ve incelemek istediğiniz SRT dosyasının yanına koyun. Bu komutlar ek bir paket gerektirmez, yalnızca sisteminizde Python 3 kurulu olmalıdır. Buradaki yerel kontroller macOS üzerinde Python 3.14.3 ile yapılmıştır. Windows kurulumunuz Python başlatıcısını kullanıyorsa, py -3 yerine python3kullanın; bu ortam burada test edilmemiştir.

Bu klasörde bir terminal açın. Bu örneklerde input.srt kısmını kendi gerçek dosya adınızla değiştirin. Boşluk içeren dosya yollarını tırnak içinde tutun.

Dokunulmamış bir kopya oluşturun

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

Hedef dosya henüz mevcut olmamalıdır. Araç, baytları kodlarını çözmeden kopyalar, kopyayı tekrar okur ve SHA-256 karmasını bildirir. Ayrıca kaynak dosya yolunun hedef olarak seçilmesini de reddeder. Kullanılabilir bir altyazı oluşturduktan sonra bile bu yedeği saklayın.

Hiçbir şey kaydetmeden UTF-8 kontrolü yapın

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

Rapor şunları içerir: strict_utf8, utf8_bom, seçilen kod çözme yöntemi ve—kod çözme başarılı olursa—bir metin önizlemesi ile replacement_characters sayısını raporlar. Varsayılan metin görünümü, baştaki UTF-8 imzasını işleyen utf-8-sigkodlamasını kullanır.

  • strict_utf8: false ifadesi, baytların UTF-8 denetiminden geçemediği anlamına gelir. Hangi kodlamanın doğru olduğunu söylemez .
  • strict_utf8: true ifadesi, bunların UTF-8 olarak çözümlenebileceği anlamına gelir. Ancak kelimelerin doğru olduğu anlamına gelmez .
  • Sıfırdan farklı bir değiştirme sayısı, seçilen kod çözme işleminin U+FFFD karakterleri ürettiği anlamına gelir. Yeni bir dosya oluşturmadan önce bunları mutlaka inceleyin.

İnceleme aracı, terminal yazı tipinin karakter kimliğini gizleyememesi için ASCII korumalı JSON çıktısı verir: \u00e9 ifadesi é, \ufffd ise değiştirme karakteri anlamına gelir. Şüpheli bir satırı ayrıntılı incelemek için altyazı numarasını değil, fiziksel satır numarasını girin:

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

Bu, Python'ın Windows-1252kodeki olan cp1252 için salt okunur bir testtir. Bu örneğin Fransızca olması nedeniyle değil; yalnızca dışa aktarma ayarları veya kaynak geçmişi bu seçimi desteklediğinde kullanın. Satır raporu her karakteri adlandırır ve kod noktasını gösterir; U+20AC euro işaretidir.

Kodlamayı ilk başarılı önizlemeye göre değil, somut kanıtlara göre seçin

Dosyayı oluşturan kişiye gerçek dışa aktarma kodlamasını sorun, dışa aktaran uygulamanın ayarlarını kontrol edin veya güvenilir bir orijinal transkriptle karşılaştırın. Dosya genelindeki aksanlı isimleri, noktalama işaretlerini, para birimi simgelerini ve örnek satırları gözden geçirin. Dili bilmiyorsanız, kod çözücünün başarılı olması bu incelemeyi sizin yerinize yapamaz.

Kaynak kodeki seçmek için "ANSI" yeterince kesin bir tanım değildir. Windows-1252 ve Latin-1 de birbirinin yerine kullanılamaz. Sunulan deneyde, tek baytlık 80 , € altında cp1252olarak çözülürken, Latin-1 altında denetim karakteri olan U+0080 altında latin-1verir. Her iki işlem de başarılı olur. Hangisinin amaçlandığını yalnızca bilinen kaynak söyleyebilir.

Diğer diller farklı eski kodlamalar kullanabilir, ancak yalnızca bir dil adı tek başına kodlamayı belirlemez. Geçmiş bilinmiyorsa ve aday okumalar birbiriyle çelişiyorsa, dönüştürmeden önce durun ve daha sağlam kaynak kanıtları elde edin.

Yalnızca kaynak metin okunabilir olduktan sonra dönüştürün

Windows-1252 olduğu doğrulanmış bir kaynak için ayrı bir UTF-8 dosyası oluşturun:

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

Dönüştürücü, kaynağın tamamını katı (strict) bir şekilde çözer, bu metni UTF-8 olarak kodlar, çıktının çözümlenmesinin aynı metni verdiğini doğrular ve yazılan baytları tekrar okur. Sıra numaralarını, zaman damgalarını, diyalogları, etiketleri veya satır sonlarını değiştirmez. Çözümlenen metin tamamen aynı kalsa bile yeni bayt dizisi farklılık gösterebilir.

Şu durumlarda kasıtlı olarak işlemi reddeder:

  • mevcut bir hedef dosyanın üzerine yazmak;
  • katı kod çözme hatasını yok sayıp devam etmek; veya
  • bu karakter kasıtlı olarak yer alsa bile U+FFFD içeren metinleri yazmak.

Son kısıtlama temkinli bir yaklaşımdır: bu araç, bir yedek karakterin neyi temsil etmesi amaçlandığına karar veremez. Komutun başarılı olması için bu karakteri kaldırmak metni geri getirmek yerine kanıtları yok eder. Python'ın hata işleyici belgeleri , replace ve ignore seçeneklerinin katı kod çözmeden neden farklı olduğunu açıklar: sorunlu verileri ikame eder veya atarlar. İkisi de bu dönüştürme adımına ait değildir.

Bir G/Ç hatası oluşursa, başarısız çıktıyı kullanmayın. Kısmi bir yeni dosya kalabilir; orijinali saklayın ve daha sonraki bir deneme için yeni bir hedef adı kullanın. Aracın tüm davranışı ve kullanımı indirilebilir README.

Peki ya BOM içeren UTF-8?

UTF-8 BOM, baştaki şu bayt dizisidir: EF BB BF. Python'ın utf-8-sig kodeki , kod çözerken bu imzayı tüketir ve kodlama yaparken ekler.

BOM içeren doğrulanmış bir UTF-8 kaynağı için şunu kullanın: --from-encoding utf-8-sig. Araç normalde UTF-8'i BOM olmadan yazar; yalnızca hedef uygulamanın gereksinimleri zorunlu kıldığında --with-bom ekleyin. BOM değiştirmek café ifadesini caféhaline getiremez. Bu deney, belirli bir oynatıcı, düzenleyici veya yükleme platformuyla uyumluluğu garanti etmez.

Beş küçük dosya, UTF-8 geçerliliğinin neden tek başına yetersiz olduğunu gösteriyor

Bu deneyde tamamen tarafımızca yazılmış iki Fransızca altyazı satırı kullanılmıştır. Bunlar bir filmden, müşteriden veya çeviri ürününden alınmamıştır:

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

13 Eylül 2026'da standart kütüphaneli bir Python 3.14.3 betiği, beş farklı bayt temsili oluşturdu ve her birini bilinen bu kaynakla karşılaştırdı. Bunlar çeviri kalitesi testi değil, deterministik bayt ve dize kontrolleridir. Bağlantılı dosyaları tarayıcı önizlemelerinden kopyalamak yerine diske kaydedin; çünkü deneyin asıl amacı farklı bayt yapılarını incelemektir.

İndirilebilir kopyaBaytKesin UTF-8 mi?UTF-8 olarak kodu çözüldüğünde metin doğru mu?UTF-8 metninde U+FFFD kaydedildi mi
Orijinal UTF-8132EvetEvet0
Orijinal Windows-1252125HayırUTF-8 olarak kodu çözülemiyor; şu kodlamada doğru: cp1252Uygulanamaz
Yanlış kod çözücü, UTF-8 olarak yeniden kaydedildi147EvetHayır0
Değiştirme karakterleri, UTF-8 olarak yeniden kaydedildi137EvetHayır6
Doğru dönüştürülmüş UTF-8132EvetEvet0

Her kopya aynı iki zaman damgası dizesini korur. Doğru dönüştürülen dosya, UTF-8 orijinaliyle bayt bayt aynıdır. Hasar görmüş iki UTF-8 dosyası daha dar kapsamlı ama faydalı bir gerçeği kanıtlar: Ne geçerli bir kodlama ne de değişmeyen zaman damgaları altyazı metninin doğruluğunu garanti eder. Eşleşen zaman damgaları, bu uydurma parçanın gerçek bir videoya uyup uymadığı hakkında da hiçbir şey söylemez.

Beş dosyayı kendiniz yeniden üretmek için reproduce.py dosyasını indirin ve henüz var olmayan bir dizin adıyla çalıştırın:

python3 reproduce.py encoding-experiment

Betik, test verilerini ve tam metni, dönüşümleri, karmaları, çalışma zamanı sürümünü ve doğrulamaları içeren bir results.json dosyası oluşturur. Bunu kaydedilen deney sonuçlarıile karşılaştırın; yalnızca oluşturulma zaman damgası farklı olacaktır. Betikler ve orijinal eğitim dosyaları bir MIT lisansı.

Yerel dönüştürücü kontrolleri ayrıca mevcut çıktıyı reddetme, kaynak yolunu reddetme, hatalı codec hatası, U+FFFD reddi, CRLF koruması ve açık BOM çıktısı durumlarını da test etti. Bu kontroller, söz konusu aracın dosya davranışını doğrular. Oynatıcı işlemesini, gerçek medya zamanlamasını veya BookTranslator çevirisini test etmez.

Bozuk karakterler zaten kaydedilmişse

Kaydedilmiş mojibake: tam geçmişi araştırın

Mojibake kopyamız bilinen bir zinciri takip etti: Orijinal UTF-8 baytları Windows-1252 olarak çözüldü, ardından bu yanlış karakterler UTF-8 olarak kaydedildi. Sonuç, café ve bozuk euro dizisini içerir: €.

Bu özel dönüşümde hiçbir bayt kaybolmadığı için yeniden üretim betiği işlemi tersine çevirebilir: Yanlış metni tekrar cp1252üzerinden kodlayın, ardından ortaya çıkan baytları UTF-8 olarak çözün. Betik, kurtarılan metni orijinale göre doğrular.

Bu durum bu bilinen zinciriçin bir kanıttır; her SRT dosyasına genel bir "mojibake onarma" işlemi uygulama talimatı değildir. Bir dosya meşru karakterler, karma geçmişler veya önceki bir onarım nedeniyle zaten değişmiş metinler içerebilir. Dokunulmamış kaynağı ve normal dönüştürme yolunu tercih edin. Elinizde yalnızca kaydedilmiş mojibake kaldıysa, bunu koruyun ve başka bir kopya üzerinde tersine dönüştürme denemeden önce nasıl üretildiğini tespit edin.

Kaydedilmiş yerine koyma karakterleri: eksik harf orada kodlanmış değildir

Kayıp örneği, Windows-1252 baytlarının yerine koyma etkinleştirilerek UTF-8 olarak çözülmesi ve ardından sonucun kaydedilmesiyle oluşturuldu. Farklı orijinal karakterler aynı � işaretçisine dönüştü. Kaydedilen işaretçi, o konumu hangi orijinal karakterin kapladığını belirlemek için yeterli bilgiyi taşımaz.

Bunu bir uygulamada sadece görmekle � karıştırmayın. Orijinal baytlara dokunulmadıysa, doğru bir kod çözme işlemi (Windows-1252 kaynağımızda olduğu gibi) metni yine de kurtarabilir. Kayıp ilan etmeden önce o kaynağı inceleyin.

Kalan tek kopya eksik metni gerçekten U+FFFD veya doğrudan soru işaretleriyle değiştirdiyse, temiz bir kaynağı yeniden dışa aktarın veya temin edin ya da güvenilir materyallere bakarak manuel bir transkripsiyonu doğrulayın. Sıradan bir soru işareti meşru bir noktalama işareti de olabilir; yalnızca varlığı hiçbir şeyi kanıtlamaz. Bir yapay zeka modelinin makul bir tahmini kurtarılan dosya verisi değil, yalnızca bir tahmindir.

Yalnızca başarılı bir komutla değil, okunabilir bir kaynakla bitirin

Onarılan dosyayı kabul etmeden önce, temsil edici kelimeleri ve sembolleri güvenilir kaynakla karşılaştırın, replik ve zaman damgası satırlarının değişmediğini doğrulayın ve yeni dosyayı onu kullanacak uygulamada açın. Betik kodu çözülmüş metni korur; bir SRT sözdizimi doğrulayıcısı veya oynatma kabul testi değildir.

Artık altyazıları okuyabiliyorsanız ve başka bir dile ihtiyacınız yoksa işlem tamamlanmıştır. Doğrudan video incelemesine veya daha fazla düzenlemeye ihtiyacınız varsa, altyazı yazılımları karşılaştırması farklı araç rollerini açıklar.

Yalnızca kaynak metin güvenilir olduğunda—ve gerçekten başka bir dile ihtiyacınız varsa— BookTranslator Altyazı Çevirici aracına ve yapay zeka altyazı çevirisi iş akışınageçin. Kodlama onarımını, çeviriyi ve nihai parçayı izlemeyi ayrı işler olarak ele alın. Hiçbiri diğerlerinin başarılı olduğunun kanıtı değildir.

İlgili Yazılar