BookTranslator
BookTranslator

Betulkan Pengekodan Sarikata SRT Tanpa Kehilangan Teks Asal

Diagnosis teks SRT yang rosak, bezakan ralat penyahkodan daripada aksara yang hilang, dan buat salinan UTF-8 berasingan dengan alat Python yang selamat dan sampel yang boleh dihasilkan semula.

BookTranslator

BookTranslator Team

11 min baca

Jika sarikata SRT anda memaparkan café dan bukannya café, jangan terus simpan fail tersebut sebagai UTF-8. Mula-mula, simpan salinan bait asalnya yang belum diusik, kenal pasti penyahkodan yang menghasilkan perkataan yang betul, dan tulis teks yang telah disahkan ke dalam fail berasingan. Menyimpan aksara yang salah dalam pengekodan baharu hanya akan mengekalkan aksara yang salah itu.

Perbezaan penting yang perlu difahami ialah antara pengekodan yang sah berbanding teks yang betul. Dalam eksperimen dua pembayang asal di bawah, satu fail yang rosak melepasi pemeriksaan UTF-8 yang ketat dan tidak mengandungi sebarang aksara penggantian. Namun teks bahasa Perancisnya tetap salah. Satu lagi fail melepasi pemeriksaan yang sama selepas enam aksara asal digantikan dengan �.

Panduan ini menyediakan alat pemeriksaan dan penukaran Python setempat, fail sumber yang boleh dimuat turun, serta ujian yang boleh dihasilkan semula. Panduan ini mengendalikan diagnosis peringkat fail dan penukaran eksplisit—bukan pengesanan pengekodan automatik, penyegerakan video, atau janji untuk memulihkan huruf yang hilang.

Mula-mula, kenal pasti apa yang sebenarnya rosak

Sambungan .srt mengenal pasti format sarikata, bukannya jaminan pengekodan tertentu. SRT mengandungi nombor pembayang, cap masa, teks, dan pemisah; rekod format SRT Library of Congress menerangkannya sebagai teks biasa tanpa satu standard pengekodan aksara yang tetap.

Gunakan simptom yang kelihatan sebagai sebab untuk menyiasat, bukannya sebagai diagnosis muktamad secara bersendirian:

Perkara yang anda lihatPerkara yang perlu diperiksaLangkah seterusnya yang wajar
Tanda aksen atau simbol kelihatan salah dalam satu aplikasiAdakah membuka semula fail yang belum diusik dengan pengekodan sumber yang diketahui menghasilkan teks yang betul?Jika ya, gunakan penyahkodan eksplisit tersebut sebelum mengeksport salinan baharu.
café kekal dalam fail yang dibaca dengan betul sebagai UTF-8Adakah UTF-8 sebelum ini tersilap dibaca sebagai pengekodan lain dan disimpan?Kembali kepada bait asal, atau siasat sejarah penukaran yang tepat. Menyimpan semula sebagai UTF-8 bukanlah satu pembaikan.
� muncul di tempat yang sepatutnya mengandungi huruf atau simbolAdakah U+FFFD benar-benar disimpan dalam fail, atau adakah aplikasi semasa yang memasukkannya semasa memaparkan bait yang tidak dapat dinyahkod?Periksa sumber yang belum diusik. Aksara pengganti yang disimpan tidak mengenal pasti aksara asal.
Kotak muncul dalam pemain media, tetapi paparan teks yang dipercayai menunjukkan aksara yang betulAdakah titik kod asasnya betul? Adakah pemain media memuatkan fail yang sama?Siasat penyahkodan, liputan fon, atau tetapan paparan pemain media sebelum mengubah fail tersebut.

Aksara dan bentuk paparannya adalah dua perkara yang berbeza. Penerangan Unicode Python membezakan titik kod daripada glif yang dirender oleh fon. Teks yang betul dalam editor menjadikan masalah pada bahagian pemain media munasabah; ini tidak membuktikan bahawa memasang fon tertentu akan menyelesaikannya. Tiada fon atau pemain media yang diuji untuk artikel ini.

Sandarkan bait, kemudian periksa penyahkodan

Muat turun subtitle_encoding.py dan letakkannya bersebelahan dengan fail SRT yang ingin anda siasat. Perintah ini memerlukan pemasangan Python 3 sedia ada dan tiada pakej tambahan diperlukan. Semakan setempat di sini menggunakan Python 3.14.3 pada macOS. Jika pemasangan Windows anda menggunakan pelancar Python, gantikan py -3 dengan python3; persekitaran tersebut tidak diuji di sini.

Buka terminal dalam folder tersebut. Dalam contoh ini, gantikan input.srt dengan nama fail sebenar anda. Kekalkan tanda petik pada laluan yang mengandungi ruang kosong.

Buat salinan yang belum diusik

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

Destinasi tersebut mestilah belum wujud. Alat ini menyalin bait tanpa menyahkodnya, membaca semula salinan tersebut, dan melaporkan cincangan SHA-256 miliknya. Ia juga menolak laluan sumber sebagai destinasi. Simpan sandaran ini walaupun selepas menghasilkan sari kata yang boleh digunakan.

Semak UTF-8 tanpa menyimpan apa-apa

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

Laporan tersebut merangkumi strict_utf8, utf8_bom, penyahkodan yang dipilih, dan—jika penyahkodan itu berjaya—pratonton teks serta replacement_characters . Paparan teks lalainya menggunakan utf-8-sig, yang mengendalikan tandatangan UTF-8 awalan.

  • strict_utf8: false bermakna bait tersebut gagal dalam pemeriksaan UTF-8. Ia tidak memberitahu anda pengekodan lain yang manakah betul.
  • strict_utf8: true bermakna ia boleh dinyahkod sebagai UTF-8. Ia tidak bermakna perkataan tersebut betul.
  • Kiraan penggantian bukan sifar bermakna penyahkodan yang dipilih menghasilkan aksara U+FFFD. Siasat aksara tersebut sebelum membuat fail baharu.

Pemeriksaan mencetak JSON selamat ASCII supaya fon terminal tidak dapat menyembunyikan identiti aksara: \u00e9 bermakna é, dan \ufffd bermakna aksara penggantian. Untuk memeriksa baris yang mencurigakan secara terperinci, minta nombor baris fizikalnya—bukan nombor isyaratnya:

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

Ini ialah ujian baca sahaja bagi Windows-1252, iaitu kodek cp1252 Python. Gunakannya apabila tetapan eksport atau sejarah sumber menyokong pilihan tersebut, bukan kerana contoh ini kebetulan menggunakan bahasa Perancis. Laporan baris menamakan setiap aksara dan menunjukkan titik kodnya; U+20AC ialah tanda euro.

Pilih pengekodan berdasarkan bukti, bukan pratonton pertama yang berjaya

Tanya pencipta fail tentang pengekodan eksport sebenar, semak tetapan aplikasi pengeksport, atau bandingkan dengan transkrip asal yang boleh dipercayai. Semak nama beraksen, tanda baca, tanda mata wang, dan baris wakil di seluruh fail. Jika anda tidak boleh membaca bahasa tersebut, penyahkod yang berjaya tidak dapat melakukan semakan itu untuk anda.

“ANSI” tidak cukup tepat untuk memilih kodek sumber. Windows-1252 dan Latin-1 juga tidak boleh ditukar ganti begitu sahaja. Dalam eksperimen yang disediakan, bait tunggal 80 dinyahkod kepada € di bawah cp1252, tetapi kepada aksara kawalan U+0080 di bawah latin-1. Kedua-dua operasi berjaya. Hanya sumber yang diketahui dapat memberitahu kita mana satu yang dimaksudkan.

Bahasa lain mungkin menggunakan pengekodan legasi yang berbeza, tetapi nama bahasa sahaja tidak menentukan pengekodan tersebut. Jika sejarahnya tidak diketahui dan bacaan calon tidak sepadan, berhenti sebelum penukaran dan dapatkan bukti sumber yang lebih baik.

Tukar hanya selepas teks sumber boleh dibaca

Bagi sumber yang disahkan sebagai Windows-1252, cipta fail UTF-8 yang berasingan:

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

Alat penukar menyahkod sumber lengkap secara ketat, mengekod teks tersebut sebagai UTF-8, menyemak bahawa penyahkodan output mengembalikan teks yang sama, dan membaca semula bait yang ditulis. Ia tidak menyunting nombor pembayang, cap masa, dialog, tag, atau penamat baris. Urutan bait baharu boleh berbeza walaupun teks yang dinyahkod kekal sama.

Ia secara sengaja enggan untuk:

  • menulis ganti destinasi sedia ada;
  • meneruskan operasi jika terdapat ralat penyahkodan yang ketat; atau
  • menulis teks yang mengandungi U+FFFD, walaupun aksara tersebut disengajakan.

Sekatan terakhir adalah bersifat konservatif: alat ini tidak dapat menentukan apa yang dimaksudkan oleh aksara penggantian tersebut. Membuangnya semata-mata untuk membolehkan arahan berjaya akan membuang bukti, bukannya memulihkan teks. Dokumentasi pengendali ralat Python menerangkan sebab replace dan ignore berbeza daripada penyahkodan ketat: ia menggantikan atau membuang data yang bermasalah. Kedua-duanya tidak sesuai untuk langkah penukaran ini.

Jika ralat I/O berlaku, jangan gunakan output yang gagal. Fail baharu yang tidak lengkap mungkin kekal; simpan fail asal dan gunakan nama destinasi baharu untuk percubaan kemudian. Tingkah laku dan penggunaan penuh alat ini terdapat dalam README yang boleh dimuat turun.

Bagaimana pula dengan UTF-8 bersama BOM?

BOM UTF-8 ialah urutan bait pemula EF BB BF. Kodek utf-8-sig Python menggunakan tandatangan tersebut semasa menyahkod dan menambahnya semasa mengekod.

Bagi sumber UTF-8 yang disahkan dengan BOM, gunakan --from-encoding utf-8-sig. Alat ini biasanya menulis UTF-8 tanpa BOM; tambah --with-bom hanya apabila keperluan aplikasi penerima memintanya. Mengubah BOM tidak boleh menukar café menjadi café. Eksperimen ini tidak menetapkan keserasian dengan mana-mana pemain, editor, atau platform muat naik tertentu.

Lima fail kecil menunjukkan sebab kesahan UTF-8 sahaja tidak mencukupi

Eksperimen ini menggunakan dua baris teks sari kata Perancis yang ditulis sendiri sepenuhnya. Ia tidak diambil daripada filem, pelanggan, atau 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 13 September 2026, skrip pustaka standard Python 3.14.3 telah menjana lima perwakilan bait dan membandingkan setiap satunya dengan sumber yang diketahui itu. Ini adalah semakan bait dan rentetan yang deterministik, bukannya tanda aras kualiti terjemahan. Simpan fail yang dipautkan ke cakera dan bukannya menyalin pratonton pelayar: perbezaan bait itulah tujuan eksperimen ini.

Salinan boleh dimuat turunBaitUTF-8 ketat?Teks betul apabila dinyahkod sebagai UTF-8?Menyimpan U+FFFD dalam teks UTF-8 miliknya
UTF-8 asal132YaYa0
Windows-1252 asal125TidakTidak boleh dinyahkod sebagai UTF-8; betul di bawah cp1252Tidak berkenaan
Penyahkod salah, disimpan semula sebagai UTF-8147YaTidak0
Aksara gantian, disimpan semula sebagai UTF-8137YaTidak6
UTF-8 yang ditukar dengan betul132YaYa0

Setiap salinan mengekalkan dua rentetan cap masa yang sama. Fail yang ditukar dengan betul adalah serupa bait demi bait dengan fail asal UTF-8. Dua fail UTF-8 yang rosak membuktikan perkara yang lebih khusus tetapi berguna: pengekodan yang sah mahupun cap masa yang tidak berubah tidak menjamin ketepatan teks sarikata. Cap masa yang sepadan juga tidak membuktikan sama ada trek rekaan ini padan dengan video sebenar.

Untuk menghasilkan semula lima fail tersebut sendiri, muat turun reproduce.py dan jalankannya dengan nama direktori yang belum wujud:

python3 reproduce.py encoding-experiment

Skrip ini menulis fail lekapan dan fail results.json yang mengandungi teks penuh, transformasi, cincangan (hash), versi masa jalan (runtime), serta penegasan (assertions). Bandingkannya dengan keputusan eksperimen yang direkodkan; cap masa penjanaan akan berbeza. Skrip dan fail pengajaran asal disertakan dengan lesen MIT.

Semakan penukar tempatan turut menguji keengganan menulis ganti output sedia ada, penolakan laluan sumber, kegagalan kodek yang salah, penolakan U+FFFD, pengekalan CRLF, dan output BOM yang eksplisit. Semakan ini mengesahkan tingkah laku fail alat ini. Ia tidak menguji pemaparan pemain, pemasaan media sebenar, atau terjemahan BookTranslator.

Jika aksara yang rosak telah pun disimpan

Mojibake yang tersimpan: selidiki sejarah perubahannya yang tepat

Salinan mojibake kami melalui rantaian yang diketahui: bait UTF-8 asal telah dinyahkod sebagai Windows-1252, kemudian aksara yang salah itu disimpan semula sebagai UTF-8. Hasilnya termasuk café dan urutan euro yang rosak €.

Oleh kerana transformasi khusus ini tidak kehilangan sebarang bait, skrip pengeluaran semula boleh membalikkannya: enkod semula teks yang salah melalui cp1252, kemudian nyahkod bait yang terhasil sebagai UTF-8. Ia mengesahkan teks yang dipulihkan berbanding teks asal.

Itu adalah bukti untuk rantaian yang diketahui ini, bukannya arahan untuk menggunakan operasi pembaikan mojibake secara sejagat pada setiap SRT. Sesuatu fail mungkin mengandungi aksara yang sah, sejarah bercampur-aduk, atau teks yang telah diubah oleh pembaikan sebelumnya. Utamakan fail sumber yang belum disentuh dan laluan penukaran yang biasa. Jika hanya mojibake yang disimpan masih tinggal, peliharanya dan kenal pasti bagaimana ia terhasil sebelum mencuba transformasi songsang pada salinan lain.

Aksara ganti yang disimpan: huruf yang hilang tidak dikodkan di situ

Contoh kehilangan ini dihasilkan dengan menyahkod bait Windows-1252 sebagai UTF-8 dengan mod penggantian diaktifkan, kemudian menyimpan hasilnya. Aksara asal yang berbeza bertukar menjadi penanda � yang sama. Penanda yang disimpan tidak membawa maklumat yang mencukupi untuk mengenal pasti aksara asal yang berada di kedudukan tersebut.

Jangan kelirukan ini dengan hanya melihatnya � di dalam aplikasi. Jika bait asal masih belum diubah, penyahkodan yang betul mungkin masih dapat memulihkan teks tersebut—seperti yang berlaku pada sumber Windows-1252 kami. Periksa sumber tersebut sebelum mengesahkan bahawa ia telah hilang.

Jika satu-satunya salinan yang tinggal telah menggantikan teks yang hilang dengan U+FFFD atau tanda soal harfiah, eksport semula atau dapatkan semula sumber yang bersih, atau sahkan transkripsi manual berpandukan bahan yang boleh dipercayai. Tanda soal biasa juga boleh menjadi tanda baca yang sah; kehadirannya sahaja tidak membuktikan apa-apa. Penggantian munasabah oleh model hanyalah tekaan, bukannya data fail yang dipulihkan.

Pastikan hasil akhirnya ialah sumber yang boleh dibaca—bukan sekadar arahan yang berjaya

Sebelum menerima fail yang dibaiki, bandingkan perkataan dan simbol wakil dengan sumber yang dipercayai, pastikan baris pembayang dan cap masa tidak berubah, dan buka fail baharu dalam aplikasi yang akan menggunakannya. Skrip ini memelihara teks yang dinyahkod; ia bukan pengesah sintaks SRT atau ujian penerimaan main balik.

Jika anda kini boleh membaca sarikata tersebut dan tidak memerlukan bahasa lain, tugas anda selesai. Jika anda memerlukan semakan video secara praktikal atau penyuntingan lanjut, perbandingan perisian sarikata menerangkan peranan alat yang berbeza.

Hanya selepas teks sumber boleh dipercayai—dan anda benar-benar memerlukan bahasa lain—barulah beralih ke Penterjemah Sarikata BookTranslator dan aliran kerja terjemahan sarikata AI. Anggap pembaikan pengekodan, terjemahan dan pratonton trek akhir sebagai tugasan berasingan. Kejayaan dalam satu bahagian bukanlah bukti bahawa bahagian lain telah berjaya.

Catatan Berkaitan