Memperbaiki Encoding Subtitle SRT Tanpa Kehilangan Teks Asli
Diagnosis teks SRT yang rusak (mojibake), bedakan kesalahan decoding dari karakter yang hilang, dan buat salinan UTF-8 terpisah dengan alat Python yang aman serta sampel yang dapat direproduksi.

Jika subtitle SRT Anda menampilkan café dan bukan café, jangan langsung menyimpan file tersebut sebagai UTF-8. Pertama, simpan salinan byte aslinya tanpa diubah, identifikasi decoding yang menghasilkan kata-kata yang benar, lalu tulis teks yang telah diverifikasi ke file terpisah. Menyimpan karakter yang salah dalam encoding baru hanya akan mengabadikan karakter yang salah tersebut.
Perbedaan pentingnya adalah encoding yang valid vs. teks yang benar. Pada eksperimen dua baris teks asli di bawah ini, satu file yang rusak lolos pemeriksaan UTF-8 yang ketat dan tidak mengandung karakter pengganti sama sekali. Namun, teks bahasa Prancisnya tetap salah. File lain lolos pemeriksaan yang sama setelah enam karakter asli digantikan dengan �.
Panduan ini menyediakan alat inspeksi dan konversi Python lokal, file sumber yang dapat diunduh, dan pengujian yang dapat direproduksi. Panduan ini menangani diagnosis tingkat file dan konversi eksplisit—bukan deteksi encoding otomatis, sinkronisasi video, atau jaminan untuk memulihkan huruf yang hilang.
Pertama, identifikasi apa yang sebenarnya rusak
Ekstensi .srt menunjukkan format subtitle, bukan jaminan encoding tertentu. SRT memuat nomor urut, penanda waktu, teks, dan pemisah; catatan format SRT dari Library of Congress menjelaskannya sebagai teks biasa tanpa satu standar encoding karakter tunggal.
Gunakan gejala yang terlihat sebagai alasan untuk menginvestigasi, bukan sebagai diagnosis akhir:
| Apa yang terlihat | Apa yang perlu diperiksa | Langkah selanjutnya yang tepat |
|---|---|---|
| Aksen atau simbol tampak salah di satu aplikasi | Apakah membuka kembali file asli dengan encoding sumber yang diketahui menghasilkan teks yang benar? | Jika ya, gunakan decoding eksplisit tersebut sebelum mengekspor salinan baru. |
café tetap muncul dalam file yang terbaca dengan benar sebagai UTF-8 | Apakah UTF-8 sebelumnya salah dibaca sebagai pengodean lain lalu disimpan? | Kembalilah ke bita asli, atau telusuri riwayat konversi pastinya. Menyimpannya kembali sebagai UTF-8 bukanlah perbaikan. |
� muncul di tempat huruf atau simbol seharusnya berada | Apakah U+FFFD benar-benar tersimpan di dalam file, atau apakah aplikasi saat ini menyisipkannya ketika menampilkan bita yang tidak dapat didekodekan? | Periksa sumber aslinya yang belum tersentuh. Karakter pengganti yang tersimpan tidak dapat mengidentifikasi karakter aslinya. |
| Kotak-kotak muncul di pemutar video, tetapi penampil teks tepercaya menampilkan karakter yang dimaksud | Apakah code point dasarnya sudah benar? Apakah pemutar memuat file yang sama? | Periksa pendekodean pemutar, cakupan font, atau pengaturan rendering sebelum mengubah file. |
Karakter dan bentuk tampilannya adalah hal yang berbeda. Penjelasan Unicode milik Python membedakan code point dari glif yang dirender font. Teks yang benar di editor menandakan kemungkinan adanya masalah di sisi pemutar; hal ini tidak membuktikan bahwa menginstal font tertentu akan memperbaikinya. Tidak ada font atau pemutar yang diuji untuk artikel ini.
Cadangkan bita, lalu periksa pendekodeannya
Unduh subtitle_encoding.py dan letakkan di samping file SRT yang ingin Anda selidiki. Perintah-perintah ini memerlukan instalasi Python 3 yang sudah ada dan tanpa paket tambahan. Pengecekan lokal di sini menggunakan Python 3.14.3 di macOS. Jika instalasi Windows Anda menggunakan peluncur Python, gantilah py -3 dengan python3; lingkungan tersebut tidak diuji di sini.
Buka terminal di folder tersebut. Pada contoh-contoh ini, ganti input.srt dengan nama file Anda yang sebenarnya. Tetap gunakan tanda kutip di sekitar jalur yang berisi spasi.
Buat salinan yang belum tersentuh
python3 subtitle_encoding.py backup "input.srt" "original-bytes.srt"
Tujuan tidak boleh sudah ada sebelumnya. Alat ini menyalin bita tanpa mendekodekannya, membaca ulang salinan tersebut, dan melaporkan hash SHA-256-nya. Alat ini juga menolak jalur sumber sebagai tujuan. Simpan cadangan ini bahkan setelah Anda berhasil membuat subtitle yang dapat digunakan.
Periksa UTF-8 tanpa menyimpan apa pun
python3 subtitle_encoding.py inspect "original-bytes.srt"
Laporan tersebut mencakup strict_utf8, utf8_bom, pendekodean yang dipilih, dan—jika pendekodean tersebut berhasil—pratinjau teks serta replacement_characters . Tampilan teks default-nya menggunakan utf-8-sig, yang menangani tanda awal UTF-8.
strict_utf8: falsemenandakan byte tersebut gagal dalam pemeriksaan UTF-8. Ini tidak memberi tahu Anda pengkodean lain mana yang benar.strict_utf8: truemenandakan byte tersebut dapat didekodekan sebagai UTF-8. Ini tidak berarti kata-katanya sudah benar.- Jumlah penggantian yang bukan nol berarti dekode yang dipilih menghasilkan karakter U+FFFD. Periksa kembali sebelum membuat file baru.
Pemeriksaan mencetak JSON yang aman untuk ASCII sehingga font terminal tidak dapat menyembunyikan identitas karakter: \u00e9 berarti é, dan \ufffd berarti karakter pengganti. Untuk memeriksa baris yang mencurigakan secara terperinci, gunakan nomor baris fisiknya—bukan nomor cue-nya:
python3 subtitle_encoding.py inspect "original-bytes.srt" --encoding cp1252 --line 3
Ini adalah pengujian hanya-baca untuk Windows-1252, codec cp1252 milik Python. Gunakan jika pengaturan ekspor atau riwayat sumber mendukung pilihan tersebut, bukan karena contoh ini kebetulan menggunakan bahasa Prancis. Laporan baris menyebutkan nama setiap karakter dan menampilkan code point-nya; U+20AC adalah simbol euro.
Pilih pengkodean berdasarkan bukti, bukan pratinjau pertama yang berhasil
Tanyakan kepada pembuat file mengenai pengkodean ekspor yang sebenarnya, periksa pengaturan aplikasi pengekspor, atau bandingkan dengan transkrip asli yang tepercaya. Tinjau nama beraksen, tanda baca, simbol mata uang, dan baris-baris representatif di seluruh file. Jika Anda tidak dapat membaca bahasa tersebut, dekoder yang berhasil tetap tidak dapat melakukan peninjauan itu untuk Anda.
“ANSI” tidak cukup presisi untuk memilih codec sumber. Windows-1252 dan Latin-1 juga tidak dapat dipertukarkan begitu saja. Dalam eksperimen yang diberikan, byte tunggal 80 didekodekan menjadi € di bawah cp1252, tetapi menjadi karakter kontrol U+0080 di bawah latin-1. Kedua operasi tersebut berhasil. Hanya sumber yang diketahui yang dapat memastikan mana yang sebenarnya dimaksudkan.
Bahasa lain mungkin menggunakan pengodean lawas yang berbeda, tetapi nama bahasa saja tidak cukup untuk menentukannya. Jika riwayatnya tidak diketahui dan pembacaan kandidat tidak cocok, berhentilah sebelum konversi dan dapatkan bukti sumber yang lebih jelas.
Konversi hanya setelah teks sumber terbaca
Untuk sumber yang telah dipastikan sebagai Windows-1252, buat file UTF-8 terpisah:
python3 subtitle_encoding.py convert "original-bytes.srt" "repaired-utf8.srt" --from-encoding cp1252
python3 subtitle_encoding.py inspect "repaired-utf8.srt"
Alat pengonversi mendekode seluruh sumber secara ketat, mengodekan teks tersebut sebagai UTF-8, memverifikasi bahwa pengodean ulang menghasilkan teks yang persis sama, lalu membaca kembali bita yang ditulis. Alat ini tidak mengubah nomor petunjuk (cue), cap waktu, dialog, tag, maupun akhiran baris. Urutan bita yang baru bisa berbeda meskipun teks hasil penguraiannya tetap identik.
Alat ini sengaja menolak untuk:
- menimpa file tujuan yang sudah ada;
- melanjutkan jika terjadi galat decoding yang ketat; atau
- menulis teks yang memuat U+FFFD, meskipun karakter tersebut memang disengaja.
Pembatasan terakhir ini bersifat konservatif: alat ini tidak dapat menentukan apa yang sebenarnya diwakili oleh karakter pengganti tersebut. Menghapusnya hanya agar perintah berhasil akan membuang bukti masalah, bukan memulihkan teks. Dokumentasi penanganan galat Python menjelaskan alasan mengapa replace dan ignore berbeda dari decoding ketat: keduanya mengganti atau membuang data yang bermasalah. Keduanya tidak boleh digunakan dalam tahap konversi ini.
Jika terjadi galat I/O, jangan gunakan keluaran yang gagal tersebut. File baru yang tidak lengkap mungkin masih tersisa; pertahankan file asli dan gunakan nama tujuan baru untuk percobaan berikutnya. Perilaku dan cara penggunaan alat selengkapnya terdapat dalam README yang dapat diunduh.
Bagaimana dengan UTF-8 dengan BOM?
BOM UTF-8 adalah urutan bita pembuka EF BB BF. Kodek utf-8-sig Python membaca tanda tangan tersebut saat mendekode dan menambahkannya saat mengodekan.
Untuk sumber yang sudah dipastikan UTF-8 dengan BOM, gunakan --from-encoding utf-8-sig. Alat ini biasanya menulis UTF-8 tanpa BOM; tambahkan --with-bom hanya jika persyaratan aplikasi penerima memang membutuhkannya. Mengubah BOM tidak dapat mengubah café menjadi café. Eksperimen ini tidak menjamin kompatibilitas dengan pemutar, editor, atau platform unggahan tertentu.
Lima file kecil menunjukkan mengapa validitas UTF-8 saja tidak cukup
Eksperimen ini menggunakan dua baris teks subtitle berbahasa Prancis yang dibuat sendiri sepenuhnya. Teks ini tidak diambil dari film, pelanggan, ataupun produk terjemahan:
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é.
Pada tanggal 13 September 2026, sebuah skrip pustaka standar Python 3.14.3 menghasilkan lima representasi bita dan membandingkan masing-masing dengan sumber yang diketahui tersebut. Ini adalah pemeriksaan bita dan string yang bersifat deterministik, bukan tolok ukur kualitas terjemahan. Simpan file yang ditautkan ke disk alih-alih menyalin pratinjau browser-nya: perbedaan bitanya adalah poin utama dari eksperimen ini.
| Salinan yang dapat diunduh | Bita | UTF-8 murni? | Teks benar saat didekodekan sebagai UTF-8? | Menyimpan U+FFFD dalam teks UTF-8-nya |
|---|---|---|---|---|
| UTF-8 asli | 132 | Ya | Ya | 0 |
| Windows-1252 asli | 125 | Tidak | Tidak dapat didekodekan sebagai UTF-8; benar di bawah cp1252 | Tidak berlaku |
| Dekoder salah, disimpan ulang sebagai UTF-8 | 147 | Ya | Tidak | 0 |
| Karakter pengganti, disimpan ulang sebagai UTF-8 | 137 | Ya | Tidak | 6 |
| UTF-8 yang dikonversi dengan benar | 132 | Ya | Ya | 0 |
Setiap salinan mempertahankan dua string stempel waktu yang sama. Berkas yang dikonversi dengan benar identik bita demi bita dengan versi asli UTF-8. Dua berkas UTF-8 yang rusak membuktikan sesuatu yang lebih spesifik namun berguna: baik pengodean yang valid maupun stempel waktu yang tidak berubah bukanlah jaminan bahwa teks terjemahan sudah benar. Stempel waktu yang cocok juga tidak membuktikan apakah trek buatan ini cocok dengan video aslinya.
Untuk mereproduksi kelima berkas tersebut sendiri, unduh reproduce.py lalu jalankan dengan nama direktori yang belum ada:
python3 reproduce.py encoding-experiment
Skrip ini akan membuat berkas fixture dan sebuah results.json yang berisi teks lengkap, transformasi, nilai hash, versi runtime, serta asersi. Bandingkan hasilnya dengan hasil eksperimen yang tercatat; stempel waktu pembuatannya tentu akan berbeda. Skrip dan berkas materi tutorial asli ini menyertakan lisensi MIT.
Pengujian konverter lokal juga menguji penolakan output yang sudah ada, penolakan path sumber, kegagalan akibat codec yang salah, penolakan U+FFFD, pelestarian CRLF, dan output BOM eksplisit. Pengujian tersebut memverifikasi perilaku berkas pada alat ini. Pengujian ini tidak menguji rendering pada pemutar media, timing media sebenarnya, ataupun penerjemahan BookTranslator.
Jika karakter yang rusak sudah terlanjur disimpan
Mojibake yang tersimpan: telusuri riwayat pastinya
Salinan mojibake kami mengikuti rantai proses yang diketahui: bita asli UTF-8 didekodekan sebagai Windows-1252, lalu karakter yang salah tersebut disimpan kembali sebagai UTF-8. Hasilnya mencakup café dan urutan simbol euro yang rusak €.
Karena transformasi khusus ini tidak menghilangkan bita apa pun, skrip reproduksi dapat membalikkannya: mengodekan ulang teks yang salah tersebut melalui cp1252, lalu mendekodekan bita yang dihasilkan sebagai UTF-8. Skrip ini memverifikasi teks yang dipulihkan terhadap berkas aslinya.
Hal tersebut merupakan bukti untuk rantai proses khusus ini, bukan instruksi untuk menerapkan operasi "perbaikan mojibake" massal ke setiap berkas SRT. Sebuah berkas bisa saja berisi karakter yang sah, riwayat proses yang bercampur, atau teks yang sudah diubah oleh perbaikan sebelumnya. Utamakan penggunaan sumber asli yang belum tersentuh dan jalur konversi normal. Jika hanya tersisa mojibake yang tersimpan, simpan berkas tersebut baik-baik dan pastikan bagaimana kerusakan itu terjadi sebelum mencoba transformasi balik pada salinan lain.
Karakter pengganti yang tersimpan: huruf yang hilang tidak dienkode di sana
Contoh berkas yang rusak dibuat dengan mendekode bita Windows-1252 sebagai UTF-8 dengan opsi penggantian aktif, lalu menyimpan hasilnya. Berbagai karakter asli yang berbeda berubah menjadi penanda � yang sama. Penanda yang tersimpan ini tidak menyimpan informasi yang cukup untuk mengidentifikasi karakter asli mana yang sebelumnya menempati posisi tersebut.
Jangan keliru menganggap hal ini sama seperti sekadar melihat � di dalam sebuah aplikasi. Jika bita asli masih belum tersentuh, dekode yang benar masih dapat memulihkan teks tersebut—seperti yang terjadi pada sumber Windows-1252 kita. Periksa sumber tersebut sebelum menyimpulkannya sebagai data yang hilang.
Jika satu-satunya salinan yang tersisa benar-benar telah menggantikan teks yang hilang dengan U+FFFD atau tanda tanya literal, ekspor ulang atau dapatkan kembali sumber yang bersih, atau verifikasi transkripsi manual terhadap materi yang tepercaya. Tanda tanya biasa juga bisa berupa tanda baca yang sah; keberadaannya saja tidak membuktikan apa pun. Penggantian yang tampak masuk akal dari sebuah model hanyalah tebakan, bukan pemulihan data berkas yang sebenarnya.
Akhiri dengan sumber yang terbaca—bukan sekadar perintah yang berhasil dieksekusi
Sebelum menerima berkas yang telah diperbaiki, bandingkan kata dan simbol perwakilan dengan sumber tepercaya, pastikan baris isyarat (cue) dan penanda waktu tidak berubah, lalu buka berkas baru tersebut di aplikasi yang akan menggunakannya. Skrip ini mempertahankan teks yang didekode; skrip ini bukan validator sintaks SRT atau uji kelayakan pemutaran video.
Jika Anda kini dapat membaca subtitelnya dan tidak memerlukan bahasa lain, tugas Anda telah selesai. Jika Anda membutuhkan peninjauan langsung pada video atau pengeditan lanjutan, perbandingan perangkat lunak subtitel menjelaskan berbagai peran dari alat-alat tersebut.
Hanya setelah teks sumber dapat dipastikan keandalannya—dan Anda memang membutuhkan bahasa lain—lanjutkan ke Penerjemah Subtitel BookTranslator dan alur kerja penerjemahan subtitel AI. Perlakukan perbaikan encoding, penerjemahan, dan peninjauan trek akhir sebagai pekerjaan yang terpisah. Keberhasilan di salah satunya bukanlah bukti bahwa yang lain juga telah berhasil.
Artikel Terkait





