Des sous-titres au tableur, et retour : ce qui survit à l'aller-retour
Publié le 05/08/2026 · 13 min de lecture · Outils pour développeurs
Daniel Okonkwo — Développeur front-end et rédacteur Tech chez Allin
Performance web · Formats de fichiers
Vérifié à partir de 3 sources
Les deux moitiés de l'aller-retour sont conformes, et un sous-titre revient exactement comme il est parti. À l'aller, chaque sous-titre devient une ligne index, début, fin, texte ; tout champ contenant une virgule, un guillemet droit ou un retour à la ligne est encadré de guillemets et les guillemets internes sont doublés, ce que décrit la RFC 4180. Les horodatages sont protégés eux aussi, automatiquement, parce que SubRip écrit ses millièmes après une virgule — 00:00:01,000 contient un séparateur. Au retour, le convertisseur CSV vers SRT lit le fichier comme des enregistrements CSV et non comme des lignes de texte : un saut de ligne ne termine un enregistrement que s'il tombe hors des guillemets, si bien qu'un sous-titre sur deux lignes comme un sous-titre sur trois lignes reviennent entiers. Testé sur la sortie même de l'exportateur, un fichier mêlant des sous-titres d'une, deux et trois lignes, avec virgules et guillemets, se reconstruit à l'octet près, et le reste après trois allers-retours consécutifs. L'import accepte aussi les fichiers séparés par des points-virgules, reconstruit dans l'ordre de la colonne index quand chaque ligne porte un numéro distinct, et signale un sous-titre qui se termine avant de commencer ou une ligne illisible. Ce qui demande encore de la prudence, ce ne sont pas les deux convertisseurs mais le tableur entre les deux, qui peut retyper une colonne d'horodatages dès l'ouverture du fichier.
Une virgule est protégée, un guillemet est doublé, et un sous-titre sur deux lignes garde ses deux lignes — vérifié à l'octet près sur trois allers-retours consécutifs. Ce qui peut encore altérer ton fichier, c'est le tableur au milieu.
Pourquoi un tableur est la bonne forme pour la relecture
Un fichier de sous-titres est un mauvais objet à confier à quelqu'un qui n'est pas sous-titreur. Il entremêle le contenu et la mécanique : un relecteur doit sauter par-dessus des numéros et des horodatages pour lire une phrase, et toute modification accidentelle d'un horodatage reste invisible jusqu'à la lecture. Une ligne par sous-titre règle les deux problèmes d'un coup. Le texte occupe une seule colonne, lisible de haut en bas ; les temps occupent leurs propres colonnes, visibles mais peu susceptibles d'être touchés ; et une seconde colonne peut accueillir une traduction, un commentaire ou une marque de validation sans rien déranger.
Les colonnes écrites par ce convertisseur sont index, début, fin et texte, dans cet ordre, avec une ligne d'en-tête portant exactement ces quatre noms. L'index est régénéré d'après la position de chaque sous-titre dans le fichier plutôt que recopié de la numérotation d'origine : un fichier dont les compteurs sont dupliqués ou désordonnés ressort proprement numéroté à partir de un. Garde cette colonne. Au retour, elle est lue et non ignorée : quand chaque ligne porte un numéro distinct, l'import reconstruit dans l'ordre de l'index, si bien qu'une feuille que tu as triée par texte pendant le travail produit tout de même un fichier de sous-titres dans le bon ordre.
Virgules, guillemets et la RFC qui les régit
Le dialogue est plein de virgules, et la virgule est le séparateur de champs : c'est donc la première chose à vérifier dans tout outil de sous-titres vers CSV. La RFC 4180, la note de 2005 qui a consigné à quoi ressemblent habituellement les fichiers CSV, donne la règle : les champs contenant des sauts de ligne, des guillemets droits ou des virgules devraient être encadrés de guillemets, et un guillemet à l'intérieur d'un tel champ est échappé en le faisant précéder d'un autre guillemet. Ce convertisseur applique les deux moitiés. « Eh bien, non, pas exactement. » s'écrit comme un champ unique entre guillemets, et Il a dit "le port", pas les docks. s'écrit "Il a dit ""le port"", pas les docks." — protégé parce qu'il contient à la fois un guillemet et une virgule, chaque guillemet interne étant doublé.
Les horodatages reçoivent le même traitement sans que personne ne l'ait décidé, et la raison tient à un heureux accident du format. SubRip écrit ses millisecondes après une virgule : 00:00:01,000 contient donc un séparateur de champs et se retrouve protégé sur chaque ligne de chaque fichier produit par cet outil. Cela vaut la peine d'être noté, car c'est le seul endroit où l'étrange choix de séparateur de SubRip te rend service : un horodatage WebVTT, qui emploie un point, sortirait sans guillemets et serait à la merci de ce que le programme lecteur décidera qu'un 00:00:01.000 non protégé représente.
Deux écarts honnêtes, sans danger pour toi mais bien réels. La RFC 4180 dit que les enregistrements sont délimités par un retour chariot suivi d'un saut de ligne ; ce convertisseur écrit un simple saut de ligne, que tous les tableurs acceptent et qui ne compte que si un maillon en aval est très littéral. Et la RFC est de statut Informational, pas une norme : elle décrit ce que font les implémentations plutôt qu'elle ne l'impose, et son propre libellé dit « devraient » et non « doivent ». La traiter comme la définition du CSV est une convention utile, pas une garantie sur le prochain programme qui lira ton fichier.
Quatre choses à savoir sur le tableur qui sert d'intermédiaire
Le séparateur. Les tableurs des langues qui utilisent la virgule comme séparateur décimal — c'est-à-dire le français, l'allemand, l'espagnol, l'italien et le portugais — enregistrent couramment un fichier avec des points-virgules entre les champs plutôt que des virgules, en suivant le séparateur de liste du système. L'import regarde le premier enregistrement et compte les séparateurs situés hors des guillemets : un tel fichier est donc lu et non refusé, et un point-virgule à l'intérieur d'un sous-titre n'est pas compté puisqu'il se trouve dans un champ protégé. Choisir explicitement la variante séparée par des virgules, quand ton tableur la propose, donne toujours un fichier plus net — mais un simple enregistrement dans l'une de ces cinq langues ne te coûte plus l'import.
Les types. Le CSV ne transporte aucune information de type — la RFC 4180 ne dit rien des types de données, car il n'y a rien à en dire : chaque champ est du texte. Les guillemets protègent l'analyse, pas le sens. Un tableur lit le champ protégé, le déballe, puis décide lui-même de ce que contient le résultat, et c'est là que l'horodatage est en danger : 00:00:01,000 est une chaîne qu'un programme a le droit de lire comme une heure, comme un nombre à séparateur de milliers, ou comme du texte, selon sa locale et ses conjectures. Rien dans le fichier ne le lui indique. La bonne habitude est d'importer plutôt que d'ouvrir — passer par le chemin d'importation de texte du tableur et régler les deux colonnes de temps sur Texte avant que les données n'arrivent — et de vérifier un horodatage avant de commencer à éditer.
Les formules. Un sous-titre dont le texte commence par un signe égal, un plus ou une arobase — et par un moins suivi d'un chiffre ou d'un autre opérateur, comme -1-1 — est écrit comme un champ protégé précédé d'une apostrophe, l'échappement que le tableur comprend déjà : la cellule affiche le texte et n'évalue rien. L'import retire cette apostrophe, si bien que =SUM(A1:A9) fait l'aller-retour tel quel. Le tiret de dialogue est délibérément laissé tranquille, car une ligne commençant par « - Oui. » est une réplique dans un fichier de sous-titres sur deux et n'est une formule dans aucun tableur. Ce dont cela ne te protège pas, c'est d'une formule que tu saisis toi-même en éditant.
L'ordre. Trier est le geste le plus naturel dans un tableur, aussi l'import lit-il la colonne d'index au lieu de l'ignorer : quand chaque ligne porte son propre numéro distinct, la sortie est reconstruite dans l'ordre de l'index et un avis t'indique que les lignes ont été remises en séquence. Trie par texte pour regrouper des répliques semblables lors d'une vérification terminologique, et le SRT reconstruit ressort tout de même dans l'ordre chronologique. Si les numéros sont dupliqués, ou absents sur certaines lignes, la colonne n'est pas fiable : l'ordre des lignes est alors conservé et l'outil le dit. Les temps à l'envers sont signalés de la même façon : une ligne allant de 00:00:09,000 à 00:00:04,000 est toujours écrite telle quelle, mais elle est désormais comptée et nommée au lieu de passer en silence.
| Ce que contient le sous-titre | Comment le CSV est écrit | Ce qui revient | Verdict |
|---|---|---|---|
| Une virgule | Champ encadré de guillemets | Identique | Survit |
| Un guillemet droit | Champ protégé, chaque guillemet interne doublé | Identique, même après plusieurs allers-retours | Survit |
| Un saut de ligne (sous-titre sur deux lignes) | Champ protégé, vrai retour à la ligne à l'intérieur — correct | Les deux lignes, dans le même sous-titre | Survit — identique à l'octet près, sur trois allers-retours |
| Un horodatage, 00:00:01,000 | Toujours protégé — il contient une virgule | Identique, si le tableur ne l'a pas retypé | Survit au fichier ; le risque, c'est le tableur |
| Un texte commençant par = + - ou @ | Protégé, précédé d'une apostrophe — l'échappement du tableur | La cellule affiche le texte ; l'import retire l'apostrophe | Survit — le tiret de dialogue n'est pas touché |
| Lignes retriées dans le tableur | Rien ne marque l'ordre d'origine, hormis la colonne d'index | La colonne d'index est lue ; la sortie est reconstruite dans son ordre | Survit — garde la colonne d'index, et lis l'avertissement |
Questions fréquentes
- Une virgule dans un sous-titre casse-t-elle le CSV ?
- Non. Tout champ contenant une virgule, un guillemet droit ou un saut de ligne est encadré de guillemets, et un guillemet à l'intérieur d'un tel champ est échappé en le doublant, ce que décrit la RFC 4180. Testé sur des cas réels : « Eh bien, non, pas exactement. » devient un champ unique protégé, et Il a dit "le port", pas les docks. devient "Il a dit ""le port"", pas les docks." — protégé parce qu'il contient à la fois une virgule et un guillemet, chaque guillemet interne étant doublé. Les deux reviennent identiques octet pour octet par le convertisseur CSV vers SRT, et survivent à trois allers-retours consécutifs sans accumuler de guillemets, ce qui est l'échec habituel d'un échappement naïf. Les horodatages sont protégés par la même règle sans que personne ne l'ait choisi, puisque SubRip écrit les millisecondes après une virgule et que 00:00:01,000 contient donc un séparateur.
- Les sous-titres sur deux ou trois lignes survivent-ils à l'aller-retour ?
- Oui, et la raison vaut d'être connue, car c'est là que ce genre d'outil échoue d'ordinaire. Un sous-titre contenant un retour à la ligne est écrit comme un champ protégé avec un vrai saut de ligne à l'intérieur, à cheval sur deux lignes physiques du fichier CSV — la forme correcte selon la RFC 4180, et celle qu'un tableur ouvre comme une cellule unique. Le convertisseur CSV vers SRT lit le fichier comme des enregistrements CSV et non comme des lignes de texte : un saut de ligne ne termine un enregistrement que hors des guillemets, si bien qu'un enregistrement à cheval sur trois lignes physiques reste un seul enregistrement. Vérifié sur la sortie même de l'exportateur : un fichier mêlant des sous-titres d'une, deux et trois lignes, dont l'un contient une virgule et l'autre un guillemet, se reconstruit à l'octet près, et le reste après trois allers-retours consécutifs. Si tu modifies le texte dans un tableur, utilise son saut de ligne dans la cellule — Alt+Entrée dans Excel sous Windows — plutôt que de taper une barre oblique inverse et un n, qui ne sont que deux caractères de texte.
- Mon tableur enregistre le fichier avec des points-virgules. Sera-t-il importé ?
- Oui. Les tableurs suivent le séparateur de liste du système, et dans les langues qui utilisent la virgule comme marque décimale — français, allemand, espagnol, italien, portugais — ce séparateur est le point-virgule : un simple enregistrement produit donc un fichier séparé par des points-virgules. L'import regarde le premier enregistrement de ce que tu colles, compte les virgules et les points-virgules situés hors des champs protégés, et retient le plus fréquent ; un point-virgule à l'intérieur d'une réplique n'est pas compté, puisqu'il est entre guillemets. Autrement dit, un fichier enregistré depuis un tableur français, allemand, espagnol, italien ou portugais s'importe tel quel. Choisir explicitement la variante séparée par des virgules — proposée le plus souvent sous un nom comme CSV UTF-8 ou « séparé par des virgules » — reste la bonne habitude si tu dois transmettre le fichier à autre chose, mais ce n'est plus une condition pour qu'il fonctionne ici.
- Excel va-t-il détruire mes horodatages en lisant 00:00:01,000 comme une heure ou un nombre ?
- Il le peut, et les guillemets n'y changent rien, car protéger et typer sont deux problèmes distincts. La RFC 4180 ne dit absolument rien des types de données — un champ CSV est du texte, et le format n'a aucun moyen d'affirmer le contraire. Les guillemets indiquent au lecteur où le champ commence et finit ; une fois déballé, ce que le lecteur décide que le contenu signifie ne dépend que de lui, et la conjecture d'un tableur dépend de sa locale autant que de la chaîne. Ne compte pas sur la chance : emprunte le chemin d'importation de texte du tableur plutôt que de double-cliquer sur le fichier, et règle les colonnes de début et de fin sur Texte avant que les données n'arrivent. Vérifie ensuite un horodatage dans la feuille, avant toute modification, et confirme qu'il affiche encore 00:00:01,000 et non une valeur alignée à droite d'une autre forme. S'il a été converti, ferme sans enregistrer et réimporte : réparer une colonne de temps abîmés coûte bien plus cher que de l'importer correctement du premier coup.
- Puis-je ajouter, supprimer ou réordonner des lignes dans le tableur ?
- Ajoute et supprime librement ; réordonne librement aussi, à condition de garder la colonne d'index. L'import lit cette colonne : quand chaque ligne porte son propre entier distinct, la sortie est reconstruite dans l'ordre de l'index et un avis te signale que les lignes ont été remises en séquence, si bien qu'une feuille triée alphabétiquement par texte pour regrouper des répliques semblables produit tout de même un fichier de sous-titres dans l'ordre chronologique. Si certaines lignes ont perdu leur numéro, ou si deux lignes partagent le même, la colonne n'est pas fiable : l'outil conserve alors l'ordre d'apparition des lignes et le dit plutôt que de deviner. Supprimer une ligne est sans danger : la sortie est renumérotée à partir de un, quels que soient les index restants. L'import signale aussi désormais un sous-titre dont la fin précède le début — une ligne allant de 00:00:09,000 à 00:00:04,000 est toujours écrite telle quelle, mais elle est comptée et nommée au lieu de passer en silence. Les temps peuvent aussi être saisis en secondes plutôt qu'en horodatages, ce qui est commode pour ajouter un sous-titre à la main : 5.5 et 8.2 sont lus comme 00:00:05,500 et 00:00:08,200.
Articles qui pourraient t'intéresser
Tous les guides →Outils similaires
SubRip n'a pas de spécification. La Bibliothèque du Congrès le décrit comme partiellement documenté et mal normalisé : ce qui constitue un fichier .srt valide est donc décidé par le lecteur, l'encodeur ou la plateforme qui le lit, et deux d'entre eux finiront par diverger. Tout ce qui est décrit ici a été vérifié sur la sortie réelle de l'outil, pas sur une norme, puisque ce format n'en a aucune. WebVTT est différent — il dispose d'une spécification publiée par le W3C — mais celle-ci reste au stade de Candidate Recommendation Draft, et non de recommandation achevée. Conserve le fichier d'origine, teste le fichier converti dans le lecteur ou l'outil d'envoi que tu comptes vraiment utiliser avant de jeter quoi que ce soit, et considère toute affirmation sur ce que font « tous les lecteurs », y compris celles de cette page, comme quelque chose à vérifier sur le vôtre.
Sources
- IETF — RFC 4180, Common Format and MIME Type for Comma-Separated Values (CSV) Files, October 2005, status Informational: each record is on a separate line delimited by CRLF, an optional header line may appear first, fields containing line breaks, double quotes or commas should be enclosed in double quotes, and a double quote inside such a field is escaped by preceding it with another double quote — and the memo says nothing at all about data types
- IANA — Media type registration for text/csv, whose reference is RFC 4180 — the registration that gives a CSV file its identity, and the counterpart to SubRip, which has no registered media type at all
- Library of Congress — Sustainability of Digital Formats, FDD000569, SubRip Subtitle format (SRT): gives the timecode as hours:minutes:seconds,milliseconds (00:00:00,000) — the comma before the milliseconds is why every timestamp exported to CSV is quoted — and records that the format has no character-encoding standard, so a parser must attempt charset detection
Tu as repéré une erreur dans cet article ?