Как работать со смесью символов UTF-8 и ISO-8859-1 в Python?

У меня есть набор документов, которые содержат символы, закодированные как в UTF-8, так и в ISO-8859-1. Я бы хотел, чтобы они были только в кодировке UTF-8.

Когда я беру документ и декодирую его в UTF-8 с помощью doc.decode('utf-8'), я получаю некоторые escape-последовательности Unicode, такие как \u2022, но у меня также есть много символов, таких как \xa0, которые, как мне кажется, являются ISO-8859-1. Я хотел бы преобразовать их в их эквиваленты в Юникоде, чтобы все счастливо жили вместе. Это возможно? Я использую Python 2.74.

Я сделал вот что:

decoded_doc = doc.decode('utf-8')
new_doc = decoded_doc.replace(u'\xa0',u' ')

но есть и другие странные персонажи, такие как \xb7 - я хочу получить их всех одним махом.


person John Thompson    schedule 16.04.2013    source источник
comment
Не существует такого понятия, как символ UTF-8. UTF-8 - это кодировка.   -  person Kerrek SB    schedule 17.04.2013
comment
U + 00A0 - ПРОСТРАНСТВО БЕЗ РАЗРЫВА; U + 00B7 - СРЕДНЯЯ ТОЧКА. Это обычные символы Юникода: нет необходимости пытаться преобразовать их в эквиваленты Юникода.   -  person Gareth Rees    schedule 17.04.2013
comment
@Gareth Rees, я вижу ... так что то, что escape-последовательность не начинается с \u, не означает, что это не юникод?   -  person John Thompson    schedule 17.04.2013
comment
Правильно, есть несколько способов написать один и тот же символ: u'\xa0' == u'\u00A0' == u'\200'   -  person Gareth Rees    schedule 17.04.2013
comment
Если вы успешно декодировали из utf-8 без создания исключения, вероятно, у вас с самого начала был действительный utf-8. Возможно, ваш источник уже испортил символы до того, как он был закодирован в utf-8, но это уже другая проблема.   -  person Mark Ransom    schedule 17.04.2013


Ответы (2)


Символы не являются исключительным свойством кодировки, нельзя сказать, что a является «символом UTF-8», а b - «символом ASCII» в том смысле и контексте, который подразумевает, что никакие другие кодировки не могут представлять эти символы.

Если ваш файл декодируется как UTF-8 без ошибок, это был действительный код UTF-8. Это не могло быть «смесью UTF-8 и ISO-8859-1».

person Esailija    schedule 16.04.2013

В качестве ответа на другой вопрос, который вы неявно задаете:

Если вы хотите, чтобы символ U + 00A0, который визуально неотличим от пробела, был преобразован в пробел вместе со многими другими подобными преобразованиями, это называется нормализацией NFKC. Вы можете сделать это с помощью unicodedata.normalize:

import unicodedata
new_doc = unicodedata.normalize('NFKC', decoded_doc)
person rspeer    schedule 28.08.2013