Охватывают ли символы UTF-8 все кодировки ISO8859-xx и windows-12xx? - PullRequest
1 голос
/ 29 февраля 2012

Я пытаюсь написать общий индексатор документов из группы документов с разными кодировками в python. Я хотел бы знать, возможно ли прочитать все мои документы (которые имеют кодировку utf-8, ISO8859-xx и windows-12xx) с utf-8 без потери символов?

Часть для чтения выглядит следующим образом:

fin=codecs.open(doc_name, "r","utf-8");

doc_content=fin.read()

Ответы [ 3 ]

10 голосов
/ 29 февраля 2012

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

В случае, если текст является all , 100% ASCII, вы можете открыть его как UTF-8 без проблем, так как первые 127 кодовых точек совместно используются двумяпредставления. * * тысяча двадцать-один

4 голосов
/ 29 февраля 2012

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

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

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

3 голосов
/ 29 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...