Discussione:
Sottotitoli - Matroska - UTF-8
(troppo vecchio per rispondere)
Frank Sinapsi
2006-11-07 17:41:48 UTC
Permalink
Il contenitore Matroska permette di inserire in un MKV vari
tipi di sottotitoli, come qui descritto:
http://www.matroska.org/technical/specs/subtitles/index.html

In particolare:
- SRT (che conosco);
- USF (che non conosco);
- SSA/ASS (che non conosco);
- sotto forma di immagini bitmap (come vobsub)

Per ora, ho implementato nel mio programma l'estrazione
"corretta" dei sottotitoli SRT (quelli che hanno come codec
"S_TEXT/UTF8"), risolvendo il problema di calcolare i giusti
timecode di inizio/fine visualizzazione di ogni entry.

Pero' e' rimasto un problema: in un MKV, i sottotitoli SRT
vengono rappresentati in UTF-8 (una codifica di "Unicode").

L'utility "mkvextract" (del pacchetto "mkvtoolnix") permette
di estrarre le tracce da un mkv, e tra queste anche gli SRT.
Se, ad esempio, la traccia 4 del file test.mkv e' un
sottotitolo SRT (codec "S_TEXT/UTF8"), con il comando

mkvextract tracks test.mkv 4:test.srt

verra' creato il file "test.srt" che conterra' appunto i
sottotitoli in formato SRT (stranamente la mia versione di
"mkvextract" ha un bug per cui il file inizia con tre bytes
che non dovrebbero esserci...).

Una cosa interessante da osservare e' questa:
quando si inserisce un file di sottotitoli in un MKV con
"mkvmerge" (o "mmg", che sarebbe la sua gui), i sottotitoli
vengono convertiti dal charset locale (iso-8859-1) a UTF-8.

Quando, in seguito, si estraggono gli stessi sottotitoli
con "mkvextract", vengono lasciati in UTF-8!

Ad esempio, se nei sottotitoli compare la parola "Perché",
dopo l'estrazione da MKV, presentandolo al tipico lettore sa,
vi troverete visualizzata una cosa del tipo: "Perché".

Per riconvertirlo al set di caratteri iso-8859-1 occorrera'
usare una utility come "iconv", ad esempio cosi':

iconv -f utf-8 -t iso-8859-1 test.srt > test-latin.srt

Il problema e' che a me fa piu' comodo estrarre i sottotitoli
gia' in formato iso-8859-1, perche' i lettori da tavolo che
ho potuto testare supportano proprio quel set di caratteri
e ovviamente non supportano UTF-8.

Quindi, per l'estrazione nel mio programma, avevo usato la
funzione di conversione (che si chiama "iconv", proprio
come l'utility a riga di comando).

Quando pero', poco fa l'ho testato su un MKV che conteneva
sottotitoli SRT in cirillico, la conversione in iso-8859-1 e'
impossibile e quella funzione fallisce; il risultato e' che le
entries dei sottotitoli che non possono essere rappresentate
nell'alfabeto latino vengono rimosse, e alla fine mi resta
solo l'ultima entry (l'unica convertibile):
------------------------------------------------
1
00:02:25,080 --> 00:02:27,000
(Subtitles translated by ????)
------------------------------------------------

Allora ho pensato di procedere cosi':

- se la entry e' convertibile, la converto;
- se non lo e', la lascio in utf-8.

Pero' in questo modo si puo' ottenere un ibrido, che non e'
ne' iso-8859-1 ne' utf-8.

Come conviene fare?
Voglio dire, come sarebbe piu' utile?
Lasciare tutto in UTF-8 oppure convertire nel set di caratteri
usato dai lettori stand-alone (con i problemi discussi)?
--
Home page: http://fsinapsi.altervista.org
Lord Kap
2006-11-07 19:59:58 UTC
Permalink
Post by Frank Sinapsi
- se la entry e' convertibile, la converto;
- se non lo e', la lascio in utf-8.
Pero' in questo modo si puo' ottenere un ibrido, che non e' ne'
iso-8859-1 ne' utf-8.
Quello che è capitato a me, invece, è che i sottotitoli salvati in
Unicode da SubRip non vengano letti da Subtitle Workshop, mentre se
salvati in ANSI tutto era a posto. Ho fatto una ricerca veloce e ho
visto che l'ISO-8859-1 ha delle differenze rispetto all'ANSI, ma sono
sicuro che quest'ultimo set sia leggibile da SW e dal lettore
standalone. Ora, io non sono molto ferrato in queste cose, ma suppondo
che l'ANSI non preveda il cirillico. ;)
Post by Frank Sinapsi
Come conviene fare? Voglio dire, come sarebbe piu' utile?
Il problema è che se estrai un sottotitolo in Unicode, comunque è
inutilizzabile (almeno per il normale motivo per cui si estraggono gli
stream da un MKV, cioè adattarli ad un lettore standalone). A questo
punto conviene tentare una conversione in ANSI (o ISO-8859-1 se non hai
la possibilità di fare quella in ANSI) di tutte le entry e se non viene,
lasciare i punti di domanda.
Oppure, nel caso che qualcuno voglia i sottotitoli estratti per qualcosa
d'altro, lasciare una opzione che chieda se fare la conversione tutta in
ANSI (o ISO-8859-1) o in Unicode.

So che mettendo in mezzo un altro set di caratteri probabilmente non ho
fatto altro che andare "fuori tema", però volevo farti sapere cosa è
capitato a me. Spero sia stato di qualche aiuto.
--
Saluti, Kap - www.lordkap.it - ¥'s Fan #01 - www.pianetalibri.com - VCC
Mi chiedi che provocazione ho avuto? / La forte antipatia del bene per
il male. - Alexander Pope
Frank Sinapsi
2006-11-07 22:24:27 UTC
Permalink
Post by Lord Kap
Quello che è capitato a me, invece, è che i sottotitoli salvati in
Unicode da SubRip non vengano letti da Subtitle Workshop, mentre se
salvati in ANSI tutto era a posto. Ho fatto una ricerca veloce e ho
visto che l'ISO-8859-1 ha delle differenze rispetto all'ANSI, ma sono
sicuro che quest'ultimo set sia leggibile da SW e dal lettore
standalone. Ora, io non sono molto ferrato in queste cose, ma suppondo
che l'ANSI non preveda il cirillico. ;)
che charset e' l'ANSI? :-)

$ iconv --list | grep -i ansi
ANSI_X3.4-1968//
ANSI_X3.4-1986//
ANSI_X3.4//
ANSI_X3.110-1983//
ANSI_X3.110//
MS-ANSI//

credo che ti riferisca a quello che "iconv" chiama MS-ANSI...
Ma mi sembra identico a iso-8859-1.
Guarda... ho creato un file "prova" che contiene questi caratteri:

32 ! " # $ % & ' ( ) * + , - . /
48 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
64 @ A B C D E F G H I J K L M N O
80 P Q R S T U V W X Y Z [ \ ] ^ _
96 ` a b c d e f g h i j k l m n o
112 p q r s t u v w x y z { | } ~
128
144
160 ¡ ¢ £ € ¥ Š § š © ª « ¬ ­ ® ¯
176 ° ± ² ³ Ž µ ¶ · ž ¹ º » Œ œ Ÿ ¿
192 À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
208 Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß
224 à á â ã ä å æ ç è é ê ë ì í î ï
240 ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ

ho provato a fare varie conversioni di questo, e mettendo come
destinazione MS-ANSI viene fuori la stessa cosa di iso-8859-1.
Quali differenze hai trovato? Io nemmeno una :-)
Post by Lord Kap
Post by Frank Sinapsi
Come conviene fare? Voglio dire, come sarebbe piu' utile?
Il problema è che se estrai un sottotitolo in Unicode, comunque è
inutilizzabile (almeno per il normale motivo per cui si estraggono gli
stream da un MKV, cioè adattarli ad un lettore standalone). A questo
punto conviene tentare una conversione in ANSI (o ISO-8859-1 se non hai
la possibilità di fare quella in ANSI) di tutte le entry e se non viene,
lasciare i punti di domanda.
ecco, questa sarebbe gia' un'idea... cosi' uno puo' controllare cosa
non e' stato convertito
Post by Lord Kap
Oppure, nel caso che qualcuno voglia i sottotitoli estratti per qualcosa
d'altro, lasciare una opzione che chieda se fare la conversione tutta in
ANSI (o ISO-8859-1) o in Unicode.
in effetti, ho visto che "mkvextract" ha un'opzione ("-c") che permette
di convertire in un formato diverso da utf-8, durante l'estrazione.
A questo punto penso' che mettero' anch'io un'opzione da qualche parte
per scegliere il charset
Post by Lord Kap
Spero sia stato di qualche aiuto.
si', grazie
--
Home page: http://fsinapsi.altervista.org
Lord Kap
2006-11-08 07:39:58 UTC
Permalink
Post by Frank Sinapsi
Ora, io non sono molto ferrato in queste cose, ma suppondo che l'ANSI
non preveda il cirillico. ;)
che charset e' l'ANSI? :-)
Ehm... Non saprei, ma qui:
<http://www.alanwood.net/demos/charsetdiffs.html>
ho trovato che ci sono differenze con l'ISO-8859-1 e quindi... ;)
Post by Frank Sinapsi
credo che ti riferisca a quello che "iconv" chiama MS-ANSI...
Ma mi sembra identico a iso-8859-1.
Non saprei, come ti dicevo ho fatto una ricerca veloce e non ho
approfondito.
Post by Frank Sinapsi
ho provato a fare varie conversioni di questo, e mettendo come
destinazione MS-ANSI viene fuori la stessa cosa di iso-8859-1.
Quali differenze hai trovato? Io nemmeno una :-)
Allora forse SubRip chiama ANSI quello che l'altro chiama ISO-8859-1?
Post by Frank Sinapsi
Spero sia stato di qualche aiuto.
si', grazie
Hai fatto felice un newbye della programmazione! ;)
--
Saluti, Kap - www.lordkap.it - ¥'s Fan #01 - www.pianetalibri.com - VCC
Raramente si migliora se non si ha altro modello da imitare che se
stessi. - Oliver Goldsmith
Frank Sinapsi
2006-11-08 07:53:18 UTC
Permalink
Post by Lord Kap
Post by Frank Sinapsi
che charset e' l'ANSI? :-)
<http://www.alanwood.net/demos/charsetdiffs.html>
ho trovato che ci sono differenze con l'ISO-8859-1 e quindi... ;)
hai ragione, quella che vedo in quella pagina e' una estensione
di iso-8859-1 con altri simboli su codici che questo non usa.
Su tutti gli altri coincidono.
E' per questo motivo che abbiamo notato entrambi che i lettori
stand-alone leggono le accentate di questi charset (perche' si
tratta degli stessi codici).
Ora ci sarebbe da fare una prova interessante:
generare dei sottotitoli che contengono tutti i codici da 32 a
255 e vedere se il lettore:
- li visualizza tutti o se salta qualcuno
- quali simboli visualizza
Lo faro' stasera, poi ti faccio sapere
Post by Lord Kap
Allora forse SubRip chiama ANSI quello che l'altro chiama ISO-8859-1?
non lo so, ma l'utility "iconv" li considera sinonimi. Forse quelle
estensioni specifiche dell'ANSI sono state aggiunte in seguito

Comunque ho deciso che mettero' una casellina spuntabile, quando si
estrae un sottotitolo, in modo da scegliere se lo si vuole lasciare
in utf-8 o convertirlo (per quanto possibile) nell'alfabeto latino
(utile per i lettori da tavolo)

ciao e grazie
--
Home page: http://fsinapsi.altervista.org
Frank Sinapsi
2006-11-08 10:57:57 UTC
Permalink
Post by Frank Sinapsi
generare dei sottotitoli che contengono tutti i codici da 32 a
- li visualizza tutti o se salta qualcuno
- quali simboli visualizza
ho fatto una prova al volo, e ho messo qui il risultato:
http://fsinapsi.altervista.org/tmp/charset.zip

dentro quello zip (149,237 bytes) ci sono due file:
- prova.jpg
- prova.srt

Chiedo scusa per la bassa qualita' dell'immagine (ho fretta),
ma spero che si riescano a vedere ugualmente i simboli.

Ora spiego brevemente cosa ho fatto: innanzitutto ho scritto
le due righe di programma necessarie a generare "prova.srt".
Poi ho preso un pezzetto di film (un segmento AVI/divx di circa
1 minuto e qualche secondo), salvato come "prova.avi", ho messo
i due file su un riscrivibile e dato in pasto al lettore
stand-alone (nortek110), quindi ho riacquisito il filmato (con
i sottotitoli impressi dal lettore), poi ho scritto due righe
di codice necessarie per estrarre dal filmato riacquisito le
56 porzioni di immagini contenenti i caratteri impressi dal
lettore; il risultato lo potete vedere nella immagine
"prova.jpg".

Come si puo' notare, il mio lettore non visualizza tutti i
simboli del charset (nemmeno di iso-8859-1, ne' tantomeno
di "Microsoft ANSI"), non mostra nemmeno il simbolo dell'euro.
Pero' mostra tutte le lettere accentate e vari altri simboli.

Immagino che abbiano fatto cio' per risparmiare spazio...
Tutto sommato non e' una cattiva soluzione: un lettore non
potrebbe supportare una codifica come utf-8...
--
Home page: http://fsinapsi.altervista.org
Loading...