охватывают ли символы utf-8 все кодировки iso8859-xx и windows-12xx?

 я пытаюсь написать общий индексатор документов из группы документов с различными кодировками в python. я хотел бы знать, возможно ли прочитать все мои документы (которые имеют кодировку utf-8, iso8859-xx и windows-12xx) с utf-8 без потери символов? 
 читающая часть выглядит следующим образом: 
fin=codecs.open(doc\_name, "r","utf-8");

doc\_content=fin.read()

 я собираюсь немного перефразировать ваш вопрос. я полагаю, что вы спрашиваете: «могу ли я открыть документ и прочитать его, как если бы он был utf-8, при условии, что он действительно должен быть iso8869-xx или windows-12xx, без потерь?». это то, что пытается сделать код python, который вы опубликовали. 
 ответ на этот вопрос - нет . размещенный вами код python будет искажать документы, если они содержат какие-либо символы выше порядкового 127. это потому, что «кодовые страницы» используют числа от 128 до 255 для представления по одному символу каждый, где utf-8 использует этот диапазон номеров для прокси многобайтовых символов , таким образом, каждый символ в вашем документе, который отсутствует в ascii, будет либо интерпретирован как недопустимая строка, либо будет объединен с последующими байтами для формирования единой кодовой точки utf-8, если вы неправильно проанализировали файл как utf-8. , 
 в качестве конкретного примера, скажем, ваш документ в windows-1252. он содержит последовательность байтов 0xc3 0xae или «м» (a-тильда, зарегистрированный знак товарного знака). в utf-8 та же самая последовательность байтов представляет один символ, «ï» (маленькое «i» с диарезом). в windows-874 та же последовательность будет «ร ฎ». это довольно разные строки - моральное оскорбление может стать приглашением играть в шахматы или наоборот. смысл потерян. 
 теперь немного другой вопрос: «могу ли я без потерь конвертировать мои файлы из их текущей кодировки в utf-8?» или «могу ли я представить все данные из текущих файлов в виде потока utf-8?». ответ на эти вопросы (по модулю несколько нечетких битов) да . unicode спроектирован так, чтобы иметь кодовую точку для каждого идеоглифа в любой ранее существующей кодовой странице, и в целом добился успеха в этой цели. есть несколько грубых краев, но вы, вероятно, будете хорошо работать с использованием unicode в качестве вашего общего формата обмена (и utf-8 является хорошим выбором для его представления). 
 однако, чтобы выполнить преобразование, вы должны уже знать и указать формат, в котором существуют файлы, по мере того, как они читаются . в противном случае python будет некорректно работать с не-ascii-символами, и вы сильно повредите свой текст (фактически, непоправимо, если вы отбросите либо последовательности invalid-in-utf8, либо источник определенного неправильно преобразованного байтового диапазона). 
 в случае, если весь текст - 100% ascii, вы можете открыть его как utf-8 без проблем, поскольку первые 127 кодовых точек распределяются между двумя представлениями. 

 utf-8 охватывает все в unicode. я не знаю наверняка , полностью ли охвачены unicode iso-8859-xx и windows-12xx, но я сильно подозреваю, что это так. 
 я полагаю, что есть некоторые кодировки, которые включают символы, которых нет в юникоде, но я был бы весьма удивлен, если бы вы встретили эти символы. покрытие всего unicode «достаточно хорошо» почти для всего - в этом и заключается цель unicode. он предназначен для покрытия всего, что нам может понадобиться (вот почему он вырос :) 
 редактировать: как уже отмечалось, вы должны знать кодировку файла самостоятельно и заявить об этом - вы не можете просто ожидать, что файлы будут магически читаться правильно. но как только вы узнаете кодировку, вы можете конвертировать все в utf-8. 

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