суббота, 20 апреля 2013 г.

Испанские субтитры и юникод




Для тех, кто изучает испанский язык по фильмам и сериалам, наверное знакома ситуация, когда субтитры доступны в формате ANSI, при этом на системе с русским языком они отображаются некорректно:


Попробовал найти штатный перекодировщик в SubtitleWorkshop и еще нескольких подобных программах, но в итоге решил перевести в нормальный вид самостоятельно, используя только Python. В итоге все прилично:



Собственно, код:

# -*- coding: utf-8 -*-
import os
import codecs
import re

path = os.getcwd()
dirs = os.listdir(path)

srclist = ['ї','б','н','й','Ў','у','ъ']
replist = ['¿','á','í','é','¡','ó','ú']
repldict = dict(zip(srclist,replist))

map(lambda x: unicode(x,'utf-8').encode('utf-8'), replist)

for sfile in dirs:
    if not '.srt' in sfile:
        continue
    with codecs.open(sfile, 'r', 'windows-1251') as f:
        newarray = []
        for line in f:
            newline = line.encode('utf-8')
            for sym in srclist:
                sym = sym.decode('utf-8').encode('utf-8')
                if sym in line.encode('utf-8'):
                    newline = re.sub(sym,replist[srclist.index(sym)].decode('utf-8').encode('utf-8'),newline)
            newarray.append(newline.decode('utf-8'))
        f.close()
    with codecs.open(sfile + '.srt', 'w', 'utf-8') as l:
        l.writelines(newarray)
        l.close()

raw_input("Press Enter to exit"
            
В список srclist добавляются все литералы, требующие замены, а в replist соответствующие им заменяющие литералы. Скрипт ищет в текущей с ним директории все файлы *.srt и обрабатывает их, потом создает новый файл рядом со старым в формате UTF-8. Вот такой велосипед.