LINUX.ORG.RU

Баг в difflib

 


0

1

Python 2.6.6 С помощью difflib.HtmlDiff() сравниваю 2 файла, создаю html, который почему-то имеет кодировку ISO-8859-1, что напрямую прописано в веб-странице:

charset=ISO-8859-1
Пишу следующий код:
def print_html(array1,array2,file_w):
        fw=open(file_w,'w')
        # array1, array2 - юникоидные списки (массивы)
        array1=array1.split(' ')
        array2=array2.split(' ')
        diff = difflib.HtmlDiff().make_file(array1, array2)
        fw.write(diff + "\n")
        fw.close()
Получаю на выходе
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0442' in position 1098: ordinal not in range(128)
Манипуляции по кодированию в UTF-8
diff=repr(diff).encode("UTF-8")
приводят к тому, что в конечном файле вместо букв кириллицы соответствующий код UTF-8 в буквальном виде через слэш (типа \xd2\xd0\xda\xe3\xe3\xdc\xdd). Кодирование списков в UTF-8 вываливается с ошибкой
'ascii' codec can't decode byte 0xd2 in position 1074: ordinal not in range(128)
Но это и понятно, потому что списки изначально юникоидные (гугл подсказывает, что кодек 'ascii' тут в действительности ни причем, это особенности парсинга python). Работает следующий хак:
# Кодируем списки
array1=array1.encode("ISO-8859-5")
array2=array2.encode("ISO-8859-5")
# Меняем кодировку в HTML
replace(file_w,'charset=ISO-8859-1','charset=ISO-8859-5')
Согласитесь, что это не айс. Это баг или фича такая?

UPD. Нашел следующий багрепорт с 2008 года: http://bugs.python.org/issue2052. Так когда починят-то?! (Судя по всему, в Python 3 он все еще остался). И как мне обратно сконвертировать в UTF-8?

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

Сейчас решаю так:

def convert_file(file_w,source_encoding,target_encoding):
        with open(file_w) as f:
                text=f.read()
        with open(file_w,'w') as f:
                f.write(unicode(text, source_encoding).encode(target_encoding))

convert_file(wda_html,'ISO-8859-5','UTF-8')
replace(wda_html,'charset=ISO-8859-1','charset=UTF-8')
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

В replace лучше добавить третий аргумент: 1.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.