Палец вверх 1
Перевод
Перевод

Охватывают ли символы 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()
python text-processing character-encoding
задан red 29 февр. 2012 г., 3:55:10
источник

3 ответа

Решение 10
Перевод
Перевод

Я собираюсь немного перефразировать ваш вопрос. Я полагаю, что вы спрашиваете: «Могу ли я открыть документ и прочитать его, как если бы он был 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 кодовых точек распределяются между двумя представлениями.

ответ дан Borealid 29 февр. 2012 г., 4:06:09
источник
Палец вверх 4
Перевод
Перевод

UTF-8 охватывает все в Unicode. Я не знаю наверняка , полностью ли охвачены Unicode ISO-8859-xx и Windows-12xx, но я сильно подозреваю, что это так.

Я полагаю, что есть некоторые кодировки, которые включают символы, которых нет в Юникоде, но я был бы весьма удивлен, если бы вы встретили эти символы. Покрытие всего Unicode «достаточно хорошо» почти для всего - в этом и заключается цель Unicode. Он предназначен для покрытия всего, что нам может понадобиться (вот почему он вырос :)

РЕДАКТИРОВАТЬ: Как уже отмечалось, вы должны знать кодировку файла самостоятельно и заявить об этом - вы не можете просто ожидать, что файлы будут магически читаться правильно. Но как только вы узнаете кодировку, вы можете конвертировать все в UTF-8.

ответ дан Jon Skeet 29 февр. 2012 г., 3:58:04
источник
Палец вверх 3
Перевод
Перевод

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

Лучший способ убедиться в этом - преобразовать большой набор документов, затем преобразовать их обратно и сделать сравнение.

ответ дан Mark Ransom 29 февр. 2012 г., 4:04:46
источник