Sottotitoli con caratteri strani: correggere la codifica
Sottotitoli con caratteri strani come é, þ o �? Trova la code page del file, convertilo in UTF-8 con Blocco note, TextEdit o FFmpeg, o imposta il player.
I sottotitoli mostrano caratteri strani quando il player legge il file con la codifica sbagliata. città invece di città, rombi, punti interrogativi: ogni schema indica una causa precisa. La soluzione è quasi sempre la stessa: convertire il file in UTF-8, oppure dire al player quale vecchia code page usa il file.
Qui sotto: come leggere il testo corrotto, in quale code page è probabilmente il tuo file, tre modi per correggerlo su Windows e Mac, perché i riquadri vuoti sono un problema diverso e come evitare che succeda di nuovo.
Perché i sottotitoli mostrano caratteri strani?
Un file .srt è testo semplice, e il testo semplice non dice con quale codifica è stato salvato. Il player deve tirare a indovinare. Prova UTF-8, la codifica che contiene tutte le scritture, e quando i byte non sono UTF-8 valido ripiega su un valore predefinito, di solito la vecchia code page di Windows del computer su cui gira.
Quelle vecchie code page sono la radice del problema. Prima che UTF-8 diventasse la norma, Windows salvava il testo in una code page per regione: Windows-1252 per l'Europa occidentale, 1254 per il turco, 1251 per il cirillico, 949 per il coreano, 932 per il giapponese. Ognuna riusa gli stessi valori di byte per lettere diverse. Il byte che in un file turco significa ş in uno occidentale significa þ.
Il riferimento Microsoft sulle code page descrive il problema senza giri di parole: queste code page «possono essere diverse su computer diversi, o possono essere modificate su un singolo computer, causando il danneggiamento dei dati», e raccomanda invece UTF-8. Un sottotitolo creato anni fa su un PC turco o coreano e riprodotto oggi su un portatile inglese è esattamente questo caso.
Il testo, di solito, è ancora nel file. A essere sbagliata è solo la lettura, ed è per questo che la correzione è rapida una volta che conosci la vera code page del file.
Cosa ti dice il testo corrotto
Ogni sintomo ha la sua causa. Questi esempi vengono da file reali che abbiamo codificato e aperto nel modo sbagliato:
| Cosa vedi | Cosa è successo | Soluzione |
|---|---|---|
Déjà vu, ç, ö (due simboli per una lettera) | Un file UTF-8 è stato letto come Windows-1252 | Imposta il player su UTF-8, oppure salva il file come UTF-8 with BOM |
Þu iþi çýðlýk, Ïðèâåò, Za¿ó³æ (lettere sbagliate) | Un file nella code page turca, russa o polacca è stato letto come europeo occidentale | Converti dalla vera code page a UTF-8 |
Rombi � o �ȳ��ϼ��� | Un file in vecchia code page è stato letto come UTF-8 | Converti dalla vera code page a UTF-8 |
??? al posto delle lettere | Le lettere sono state cancellate quando qualcuno ha salvato il testo in una code page che non le contiene | Recupera di nuovo il file originale; nessuna conversione le ripristina |
| Riquadri vuoti, il resto corretto | Il font non ha i glifi per quella scrittura; il testo è a posto | Cambia il font |
Le prime due righe sono le più comuni, e sono opposte. Nella prima il file è già corretto e a sbagliare è il player. Nella seconda e nella terza il file è in una vecchia code page, quindi si rompe in ogni player che non indovina quella code page. Convertirlo una volta sola in UTF-8 sistema tutti i player in un colpo.
In quale code page è il tuo file di sottotitoli?
Te lo dice la lingua dei sottotitoli. Un file che non è UTF-8 è quasi sempre nella vecchia code page di Windows della sua lingua:
| Lingua dei sottotitoli | Vecchia code page di Windows | Nome per FFmpeg |
|---|---|---|
| Inglese, francese, tedesco, spagnolo, portoghese, italiano | 1252 | CP1252 |
| Polacco, ceco, ungherese | 1250 | CP1250 |
| Russo, ucraino, bulgaro | 1251 | CP1251 |
| Greco | 1253 | CP1253 |
| Turco | 1254 | CP1254 |
| Arabo | 1256 | CP1256 |
| Giapponese | 932 (Shift-JIS) | CP932 |
| Coreano | 949 | CP949 |
| Cinese semplificato | 936 (GB2312) | GB18030 |
| Cinese tradizionale | 950 (Big5) | CP950 |
GB18030 è il sovrainsieme della code page del cinese semplificato, quindi legge anche i file salvati come GBK o GB2312.
Per controllare di cosa si tratta, apri il file in Blocco note di Windows: la barra di stato indica la codifica, e «ANSI» significa una vecchia code page. Su un Mac, o in Git Bash su Windows, esegui:
file --mime-encoding subtitles.srt
utf-8 o us-ascii significa che il file è a posto e la colpa è del player. iso-8859-1 o unknown-8bit significa una vecchia code page. Lo strumento non sa dire quale, quindi affidati alla lingua indicata nella tabella.
Tre modi per correggere la codifica dei sottotitoli
- Salva di nuovo il file in UTF-8 in un editor di testo. Gratis e veloce per un solo file.
- Convertilo con FFmpeg. Un solo comando, qualsiasi code page, Windows, Mac e Linux.
- Indica la codifica al player o all'encoder. Nessun nuovo file, ma la correzione resta in quel solo programma.
I primi due ti danno un file UTF-8 che si riproduce correttamente ovunque. Il terzo è un ripiego per un solo programma su un solo computer.
Metodo 1: salva il file di sottotitoli in UTF-8 con Blocco note o TextEdit
Su Windows, apri l'.srt in Blocco note. Quando un file non è UTF-8 valido, Blocco note lo legge con la code page di sistema di Windows. Funziona se il file corrisponde al tuo sistema: un file turco su un Windows turco si apre correttamente. Se il testo sembra giusto, scegli File → Salva con nome, imposta Codifica su UTF-8 e salva con un nuovo nome. Se il testo sembra sbagliato anche in Blocco note, la code page del tuo sistema non è quella del file, quindi passa al Metodo 2.
Su un Mac, TextEdit ti lascia scegliere la codifica quando apri il file. La guida di Apple ai caratteri che non vengono visualizzati correttamente indica i passaggi: nella finestra di apertura fai clic su Show Options (Mostra opzioni), poi scegli una codifica dal menu Plain Text Encoding (Codifica del testo semplice). Scegli quella della lingua dei sottotitoli, controlla che il testo si legga correttamente, poi salva una copia in UTF-8. L'impostazione predefinita per il salvataggio si trova in TextEdit → Settings → Open and Save (TextEdit → Impostazioni → Apri e salva), sotto Plain Text File Encoding (Codifica file di testo semplice).
Due limiti: si lavora su un file alla volta, e funziona solo se il testo sembra giusto dopo l'apertura. Non salvare mai un file che appare ancora corrotto: scriveresti per sempre le lettere sbagliate in UTF-8.
Metodo 2: converti i sottotitoli in UTF-8 con FFmpeg
FFmpeg legge un file di sottotitoli in qualsiasi code page tu indichi con -sub_charenc, che la documentazione di FFmpeg descrive come «Set the input subtitles character encoding» (imposta la codifica dei caratteri dei sottotitoli in ingresso), e scrive l'output in UTF-8. Usa la riga per la tua lingua. Le abbiamo eseguite tutte su file di prova:
ffmpeg -sub_charenc CP1252 -i french.srt french-utf8.srt
ffmpeg -sub_charenc CP1250 -i polish.srt polish-utf8.srt
ffmpeg -sub_charenc CP1251 -i russian.srt russian-utf8.srt
ffmpeg -sub_charenc CP1253 -i greek.srt greek-utf8.srt
ffmpeg -sub_charenc CP1254 -i turkish.srt turkish-utf8.srt
ffmpeg -sub_charenc CP1256 -i arabic.srt arabic-utf8.srt
ffmpeg -sub_charenc CP932 -i japanese.srt japanese-utf8.srt
ffmpeg -sub_charenc CP949 -i korean.srt korean-utf8.srt
ffmpeg -sub_charenc GB18030 -i chinese.srt chinese-utf8.srt
ffmpeg -sub_charenc CP950 -i chinese-traditional.srt chinese-traditional-utf8.srt
-sub_charenc deve venire prima di -i. Se lo ometti, FFmpeg si ferma con questo errore, che è anche il modo per capire che un file non è UTF-8:
Invalid UTF-8 in decoded subtitles text; maybe missing -sub_charenc option
Se l'output mostra ancora lettere sbagliate, l'ipotesi era sbagliata. Prova la code page vicina nella tabella. Un file cirillico letto come CP1251 non può mai uscire come turco, quindi un'ipotesi sbagliata si vede al primo sguardo.
Lo stesso comando funziona su Windows, Mac e Linux, e FFmpeg è gratuito.
Metodo 3: imposta la codifica in VLC, HandBrake o nel burn-in con FFmpeg
Quando preferisci non creare un nuovo file, indica la codifica al programma che lo legge.
VLC. La pagina sulla codifica dei sottotitoli della wiki di VideoLAN indica il percorso: Tools → Preferences, poi Subtitles / OSD → Default encoding. Scegli la code page, premi Save e riavvia VLC. Aiuta nel caso della seconda e della terza riga della tabella dei sintomi. Cambia VLC solo su quel computer: lo stesso file continua a rompersi su una TV, su un telefono o su un media server.
HandBrake. Quando importi un SRT nella scheda Subtitles, la documentazione di HandBrake dice di «assicurarti che il codice dei caratteri corretto sia selezionato dal menu a tendina "Char Code"», e avverte che quello sbagliato «farà sì che il file di output non abbia alcuna traccia di sottotitoli».
Burn-in con FFmpeg. Il filtro subtitles ha una propria opzione charenc, quindi puoi imprimere nell'immagine un file in vecchia code page direttamente:
ffmpeg -i video.mp4 -vf "subtitles=turkish.srt:charenc=CP1254" -c:a copy output.mp4
Su un Mac, l'ffmpeg predefinito di Homebrew non ha libass e segnala che il filtro subtitles non esiste; installa ffmpeg-full ed esegui il suo binario da $(brew --prefix ffmpeg-full)/bin/ffmpeg. Le altre opzioni per imprimere i sottotitoli sono nella nostra guida per imprimere i sottotitoli in un video.
Sottotitoli con riquadri al posto delle lettere: un problema di font, non di codifica
I riquadri significano che il testo è stato letto correttamente e che il font non ha un glifo per disegnarlo. Convertire il file qui non cambia nulla.
Come si manifesta dipende dal renderer. Abbiamo impresso con FFmpeg su Windows una battuta coreana con stile Impact, un font solo latino: libass ha disegnato virgola e punto con Impact e ha preso l'Hangul da un altro font installato. Nessun riquadro, ma un aspetto misto che non hai scelto tu. I riquadri compaiono quando nessun font della macchina copre la scrittura, cosa che succede sui server e sui player con un set di font integrato ridotto.
La soluzione è indicare un font che copra la lingua. In un burn-in con FFmpeg si fa con force_style:
ffmpeg -i video.mp4 -vf "subtitles=korean-utf8.srt:force_style='FontName=Malgun Gothic'" -c:a copy output.mp4
Quale font di sistema copre quale scrittura su Windows e Mac è elencato nella nostra guida ai font per i sottotitoli.
Come Sablate gestisce la codifica e i font dei sottotitoli
Sablate scrive ogni export di sottotitoli, .srt, .vtt, .txt e .ass, in UTF-8. Una trascrizione parte in Unicode, quindi nessuna code page entra mai nel file, e lo stesso export si legge correttamente in coreano, turco o arabo.
I font sono gestiti per lingua. Ogni livello di traduzione ha il proprio stile, e quando il font dei sottotitoli che hai scelto non riesce a disegnare la scrittura, Sablate ne sostituisce uno fornito dal sistema: Malgun Gothic su Windows e Apple SD Gothic Neo su Mac per il coreano, Yu Gothic UI e Hiragino Sans per il giapponese, Microsoft YaHei e PingFang SC per il cinese semplificato. L'anteprima usa lo stesso font del burn-in, quindi ciò che controlli è ciò che viene reso.
Un limite onesto: l'importazione di .srt e .vtt di Sablate legge i file come UTF-8 e non riconosce le vecchie code page. Converti un vecchio file con il Metodo 1 o il Metodo 2 prima di importarlo. La panoramica delle funzioni elenca il resto dell'editor e degli export.
| Legge le vecchie code page | Cosa ottieni | Piattaforme | Prezzo | |
|---|---|---|---|---|
| Notepad | Solo la code page del tuo sistema | Una copia UTF-8 del file | Windows | Gratis |
| TextEdit | Sì, scelta all'apertura | Una copia UTF-8 del file | Mac | Gratis |
| FFmpeg | Sì, qualsiasi, con -sub_charenc o charenc | Una copia UTF-8, o un video con i sottotitoli impressi | Windows, Mac e Linux | Gratis |
| VLC | Sì, con Default encoding | Riproduzione corretta su quel computer | Windows, Mac e Linux | Gratis |
| HandBrake | Sì, con Char Code all'importazione di un SRT | Un video con i sottotitoli dentro | Windows, Mac e Linux | Gratis |
| Sablate | No, importa solo UTF-8 | Export UTF-8 e un font di burn-in per lingua | Windows e Mac | Piano Free; Pro $29 una tantum o $5.99 al mese |
Per riparare un file esistente vincono gli strumenti gratuiti: FFmpeg e TextEdit leggono qualsiasi vecchia code page e Sablate no. Sablate è adatto quando i sottotitoli li stai creando, soprattutto in più lingue, e vuoi file che non abbiano mai bisogno di questa riparazione.
Quale correzione usare?
«Un file appare sbagliato in VLC sul mio computer.» Cambia il Default encoding di VLC, oppure converti il file una volta e non pensarci più.
«I sottotitoli devono funzionare su una TV, un telefono, Plex o YouTube.» Converti in UTF-8 con il Metodo 1 o 2. Gli altri dispositivi non condividono le tue impostazioni di VLC, e la pagina di YouTube sui file di sottotitoli dice che un SRT «must be in plain UTF-8» (deve essere in UTF-8 semplice).
«Vedo é e ö.» Il file è già UTF-8. Correggi il player, oppure salva una copia come UTF-8 with BOM in Blocco note, così il file dichiara la propria codifica.
«Sto imprimendo i sottotitoli nel video.» Usa charenc nel comando FFmpeg, oppure converti prima, poi controlla il font per la lingua.
«Vedo punti interrogativi.» Smetti di convertire e cerca il file originale. Le lettere non sono più in questo.
Come evitare che i sottotitoli si rompano di nuovo
Salva ogni file di sottotitoli in UTF-8. In Blocco note è la scelta Codifica in Salva con nome; evita ANSI. Su un Mac, imposta una volta sola la codifica di salvataggio di TextEdit su UTF-8.
Converti prima di modificare. Modificare un file corrotto e poi convertirlo mescola due codifiche in un solo file, e il risultato è molto più difficile da riparare.
Tieni l'originale finché la copia convertita non si legge correttamente dove verrà davvero riprodotta: sulla TV, nel media server, sul sito. Se un dispositivo datato legge ancora male l'UTF-8, di solito una copia salvata come UTF-8 with BOM risolve, perché il BOM segnala il file come UTF-8 ai programmi che altrimenti tirerebbero a indovinare.
Quando crei i sottotitoli da zero, la codifica fa parte del farli bene. Come creare un file SRT tratta le trappole della finestra di salvataggio su Windows e Mac.
Se i sottotitoli li stai generando invece di riparare quelli vecchi, parti da uno strumento che scrive UTF-8 e sceglie per te un font per lingua. Scarica Sablate per Windows o Mac ed esporta il tuo primo file in una qualsiasi delle sue 100 lingue di trascrizione.
Domande frequenti
Perché i miei sottotitoli mostrano caratteri strani?
Perché il player ha letto il file con la codifica sbagliata. Un file di sottotitoli non indica quale codifica usa, quindi il player tira a indovinare, e un errore trasforma le lettere accentate o non latine in simboli. Converti il file in UTF-8, oppure di' al player in quale code page è stato salvato, e le lettere tornano a posto.
Come si converte un file di sottotitoli in UTF-8?
Aprilo in un editor di testo che lo legge correttamente e salva una copia in UTF-8, oppure usa FFmpeg indicando la vecchia code page del file, ad esempio ffmpeg -sub_charenc CP1254 -i input.srt output.srt per il turco. FFmpeg scrive il nuovo file in UTF-8. Controlla il risultato nel player prima di eliminare l'originale.
Come si cambia la codifica dei sottotitoli in VLC?
Apri Tools, poi Preferences, poi Subtitles / OSD, e scegli la code page del file nell'elenco Default encoding. Fai clic su Save e riavvia VLC perché la modifica abbia effetto. L'impostazione corregge la riproduzione solo in VLC su quel computer: converti il file in UTF-8 se deve funzionare anche su una TV, su un telefono o su un sito.
Perché i sottotitoli mostrano punti interrogativi al posto delle lettere?
Perché le lettere sono andate perse quando il testo è stato salvato in una codifica che non ha posto per loro. Un sottotitolo coreano o russo salvato come testo dell'Europa occidentale, per esempio, conserva un punto interrogativo per ogni lettera che non riesce a contenere. Nessuna conversione le recupera: serve il file originale o un nuovo export dalla fonte.
Cosa significa Invalid UTF-8 in decoded subtitles text in FFmpeg?
Significa che FFmpeg si aspettava un file di sottotitoli UTF-8 e ha trovato byte di una vecchia code page. Il messaggio stesso di FFmpeg suggerisce la soluzione: aggiungi -sub_charenc con la codifica del file prima di -i, come CP1251 per il russo o CP949 per il coreano, oppure usa l'opzione charenc del filtro subtitles quando imprimi il file nel video.
Quale codifica devono usare i file di sottotitoli?
UTF-8. Contiene tutte le scritture in un'unica codifica, quindi lo stesso file si legge correttamente in qualsiasi lingua e su qualsiasi dispositivo. YouTube richiede file SRT in UTF-8 semplice, e player, TV e media server lo leggono in modo molto più affidabile di una vecchia code page di Windows. Se un dispositivo datato legge male un file UTF-8, prova a salvarlo come UTF-8 with BOM.