2013-12-25 5 views
1

У меня есть набор текстовых файлов, содержащих корейские символы с неправильными кодировками. В частности, кажется, что символы кодируются EUC-KR, но сами файлы были сохранены с помощью спецификации UTF8 +.Фиксация поврежденного кодирования (с Python)

До сих пор мне удалось исправить файл со следующим:

  1. Открыть файл с EditPlus (это показывает, кодировкой файла является UTF8+BOM)
  2. В EditPlus, сохраните файл как ANSI
  3. Наконец, в Python:

    with codecs.open(html, 'rb', encoding='euc-kr') as source_file: 
        contents = source_file.read() 
    
    with open(html, 'w+b') as dest_file: 
        dest_file.write(contents.encode('utf-8')) 
    

Я хочу автоматизировать это, но я не смог этого сделать. Я могу открыть исходный файл в Python:

codecs.open(html, 'rb', encoding='utf-8-sig') 

Однако, я не мог понять, как сделать 2. часть.

+0

Можете ли вы показать нам пример строки из файла данных? Первая строка или около того с BOM была бы лучше всего. –

ответ

5

Я предполагаю, что здесь у вас есть текст уже закодированы EUC-KR, затем кодируются снова в UTF-8. Если это так, кодирование на латиницу 1 (то, что Windows вызывает ANSI), действительно является лучшим способом вернуться к исходной последовательности EUC-KR.

Открыть файл в UTF8 с BOM, закодировать Latin1, декодирование, как EUC-KR:

import io 

with io.open(html, encoding='utf-8-sig') as infh: 
    data = infh.read().encode('latin1').decode('euc-kr') 

with io.open(html, 'w', encoding='utf8') as outfh: 
    outfh.write(data) 

Я использую io.open() function здесь вместо codecs как более надежного метода; io является новая библиотека Python 3 также портированном на Python 2.

Демо:

>>> broken = '\xef\xbb\xbf\xc2\xb9\xc3\x8c\xc2\xbc\xc3\xba' 
>>> print broken.decode('utf-8-sig').encode('latin1').decode('euc-kr') 
미술 
+0

Это сработало отлично. :) – joon

+0

Оказалось, что у меня есть еще один набор файлов с различными кодировками. Не могли бы вы взглянуть на отредактированный вопрос и посмотреть, можете ли вы мне помочь? Благодаря! – joon

+0

Очень сложно сказать, какой процесс производил эти другие байты. Здесь слишком мало контекста; недостаточно информации о том, какой текст * предполагается * представлять, или в каком процессе эти файлы прошли. Символом Unicode, который является проблематичным, является символ Евро, поэтому, возможно, вместо кодировки Latin-1 будет работать кодек кодовой страницы Windows; есть несколько кодеков CP125x, которые близки к Latin-1, за исключением таких вещей, как символ евро. Сделайте новый вопрос с большей выдержкой. –

Смежные вопросы