Обратное распространение неправильно (двойного) закодированного CSV

У меня есть файл CSV, который кто-то неправильно закодировал.

Файл представляет собой базу данных фильмов с соответствующими актерами. Я скачал его, чтобы попрактиковаться в кодировании так называемого числа Бэкона.

Это выглядит так:

movieId,title,actors
(...)
61,Eye for an Eye (1996),(a ton of other actors)|Dolores VelÌÁzquez|(more actors)
59,The Confessional (1995),(a ton of other actors)|Richard Fr̩chette|Fran̤ois Papineau|Marie Gignac|Normand Daneau|Anne-Marie Cadieux|Suzanne Cl̩ment|Lynda Beaulieu|Pascal Rollin|Billy Merasty|Paul H̩bert|Marthe Turgeon|Adreanne Lepage-Beaulieu|Andr̩e-Anne Th̩roux-Faille|Rodrigue Proteau|Philippe Paquin|Pierre H̩bert|Nathalie D'Anjou|Danielle Fichaud|Jules Philip|Jacques Laroche|Claude-Nicolas Demers|Jean-Philippe C̫t̩|Tristan Wiseman|Marc-Olivier Tremblay|Jacques Brouillet|Jean-Paul L'Allier|Denis Bernard|Ren̩e Hudon|Serge Laflamme|Carl Mathieu
(...)

Теперь, как видите, вместо умлаутов и букв с ударениями (ÄÖÜ, É, À, Û и т. д.) у актеров вместо умлаутов используются комбинации других специальных символов.

Благодаря очень полезному ответу на этот вопрос мы установили, что это действительно случай Моджибаке.

Моя цель — программно исправить неработающие символы, декодируя и кодируя их в правильном порядке.

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

Martin Brown 07.03.2024 16:48

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

Joachim Sauer 07.03.2024 16:51

Спасибо, @MartinBrown, я добавил в пост еще несколько примеров.

LuHo 07.03.2024 17:02

Похоже, что 8-битная кодировка Иоахим говорит об отображении Ì для байта 0xc3. К сожалению, я не использую здесь 8-битную кодировку...

Serge Ballesta 07.03.2024 17:06

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

Joachim Sauer 07.03.2024 17:18

@JoachimSauer, спасибо, это тоже была моя первоначальная идея. Проблема в том, что CSV очень большой (тысячи длинных строк), и его невозможно проверить вручную. Итак, есть некоторые очень специфические случаи, такие как перевернутый восклицательный знак, которые встречаются 1–3 раза. Я случайно заметил этот восклицательный знак, но могут быть и другие случаи, которые я бы пропустил. Если они закодированы тремя символами, я неправильно закодирую два из них (М плюс следующий за ним) вместо полного, создавая еще больше новых проблем. Поэтому я бы хотел избежать такой таблицы.

LuHo 07.03.2024 17:33

Вы столкнулись с двойным случаем моджибаке (пример на Python): 'FrÌ©chette|Fran̤ois'.encode( 'cp1252').decode( 'mac-romanian').encode( 'cp1252').decode( 'utf-8') возвращает 'Fréchette|François'. Пожалуйста, отредактируйте свой вопрос, чтобы улучшить минимально воспроизводимый пример. В частности, расскажите, откуда взялся файл csv (т. е. как он создается), а также как вы его читаете…

JosefZ 07.03.2024 19:41

Я предполагаю, что один из вариантов — взять правильные образцы необработанного текста и применить к нему каждую пару преобразований символьных страниц, которые вы можете придумать, и надеяться, что одно из них даст вам Ì для байта 0xc3 и, следовательно, будет совпадением. В противном случае я думаю, что идея @Joachim Sauers, вероятно, имеет наибольшую вероятность успеха (даже если вам придется делать это несколько раз, когда выявляются новые, нечастые неисправности). Я подозреваю, что странный случай невозможно исправить.

Martin Brown 08.03.2024 11:16

@JosefZ большое спасибо! Мне удалось исправить ПОЧТИ ВСЁ! Я обновил вопрос своей новой информацией

LuHo 08.03.2024 12:30

Снова. Пожалуйста, отредактируйте свой вопрос, чтобы улучшить минимально воспроизводимый пример. В частности, расскажите, откуда взялся файл csv (т. е. как он создан; пожалуйста, дайте ссылку на файл csv, если можете…), а также как вы его читаете…

JosefZ 08.03.2024 16:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
10
101
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот что ближе всего к решению (предоставлено JosefZ):

Вы столкнулись с двойным моджибаке (пример на Python): 'Fréchette|Fran̤ois'.encode( 'cp1252').decode( 'mac-romanian').encode( 'cp1252').decode( 'utf- 8') возвращает «Фрешетт|Франсуа».

Благодаря очень полезному ответу на этот вопрос мы установили, что это действительно случай Моджибаке.

Я добился прогресса в следующей конфигурации (python):

  1. Прочитать текущий CSV с не указанной кодировкой
  2. encode('cp1252').decode('mac-roman').encode('cp1252').decode('iso-8859-16')
  3. Запишите результат в новый CSV с указанной кодировкой «iso-8859-16».

В этой конфигурации многие символы теперь исправлены, но некоторые все еще отсутствуют. Я не знаю, означает ли это, что мне придется снова декодировать и кодировать (всего три раза), или я просто еще не нашел правильную конфигурацию для набора из двух декодируемых кодов.

Вот список символов, которые все еще повреждены после вышеуказанного перекодирования:

after re-encoding | just reading | desired outcome | notes
==============================================================================
�                | Ì            | Á               | the lower case á works;
�_               | Ì_           | ü               | the upper case Ü works
�_               | Ì_           | ä               | I can't confirm whether upper case Ä works
                                 | æ               | I can't confirm whether this exists, but I confirmed one upper case that works; it's possible the file uses 'ae' instead
                                 | œ               | I can't confirm whether any of this exists; it's possible the file uses 'oe' instead
�_               | Ì_           | í               | I can't confirm whether upper case Í works
�_               | Ì_           | ó               | the upper case Ó works
�_               | Ì_           | þ               | the upper case Þ doesn't exist, I think

Заключение:

Как видите, как чтение файла «как есть», так и чтение его после перекодирования, отображает все пропущенные символы как один и тот же битый символ, поэтому восстановить исходную информацию по ним кажется невозможным (информация заблудился в процессе Моджибаке). Боюсь, что эти строки придется исправлять вручную.

Другие вопросы по теме