2016-01-15 6 views
0

У меня есть база данных SQL, которая имеет проблемы кодирования, так что возвращается мне результат, который похож на это:Python 3.3 Кодирование Выпуск

"Cuvée" 

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

"Cuvée" 

Я использую Python 3.3, но с использованием кодеков .decode, чтобы сделать изменения от latin1 в кодировке UTF-8 я получаю:

'str' does not support the buffer interface 

Я думаю, что я попробовал все, я нашел безрезультатно. Я не очень заинтересован в том, чтобы перейти на Python 2.7, потому что я написал остальную часть скрипта на 3.3, и это будет довольно больно переписать. Есть ли способ сделать это, о котором я не знаю?

+1

Пожалуйста, покажите свой фактический код, который выдает исключение. Вам придется * перекодировать * (кодировать, а затем декодировать). –

ответ

1

Да, у вас есть то, что называется Mojibake; это может быть латинский-1, или это может быть Windows Codepage 1252 или другой тесно связанный кодек.

Вы могли просто попытаться закодировать в Latin-1, а затем декодировать снова:

faulty_text.encode('latin1').decode('utf8') 

Однако, иногда, особенно с CP1252 Mojibakes, неисправных результатов кодирования в тексте, который не может юридически быть закодированы назад к байтам, потому что некоторые байты UTF-8 были «декодированы», хотя кодек не поддерживает эти байты.

Ваш лучший выбор - установить ftfy library, который может автоматически исправить ошибки Mojibake для вас. Он включает специальные кодеки для правильной отмены CP1252 Mojibakes (а также других связанных кодовых страниц), кодеков, которые обходят вышеупомянутые проблемы.

+0

Большое вам спасибо! Это решило! – brunoban

1

Попробуйте сначала преобразовать в байты, а затем декодировать unicode. Основываясь на вашем примере:

latin_string = "Cuvée" 
# Get a byte representation of the latin string 
bytes(latin_string,'latin-1') 
b'Cuv\xc3\xa9e' # Note the preceding b 
# Get a byte representation and decode the utf-8 to get a 'pretty' string 
bytes(latin1string,'latin-1').decode('utf-8') 
'Cuvée'