Исправление кодировки XML - PullRequest
3 голосов
/ 13 января 2011

У меня есть xml с тегом кодировки, установленным на 'utf-8'.Но на самом деле это iso-8859-1.

Программно, как мне обнаружить это в perl и python?и как мне декодировать с другой кодировкой?

В Perl я пытался

$xml = decode('iso-8859-1',$file)

, но это не работает.

Ответы [ 3 ]

4 голосов
/ 13 января 2011

Неверно сложно обнаружить неправильное кодирование, поскольку случайные двоичные данные часто представляют собой допустимые строки во многих многих кодировках.

В Perl проще всего было бы попытаться декодировать его как utf-8 и проверить на наличие сбоев. (это работает только так; документ на западном языке в кодировке utf-8 также почти всегда является действительным документом iso-8859-1)

my $xml = eval { decode_utf8( $file, FB_CROAK ) };
if ( $@ ) { is_probably_iso-8859-1_instead }

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

Если нет декларации XML или MIME-типа, будет использоваться собственная кодировка Perl, поэтому скопированный код должен справиться с задачей.

Если существует ошибочное объявление XML, вы можете либо переопределить его, используя любое средство, предоставляемое вашей библиотекой декодирования XML, либо просто заменить его вручную перед передачей.

# assuming it's on line 1:
$contents =~ s/.*/<?xml version="1.0" encoding="ISO-8859-1"?>/;
1 голос
/ 13 января 2011

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

Кроме того, главное, что ваш файл не является XML, поэтому вы не можете исправить это с помощью инструментов XML. Вам нужно атаковать его на уровне персонажа или бинарника. Как уже говорили другие, шаг 1 состоит в том, чтобы обнаружить, что это недопустимый UTF-8; Шаг 2 - удалить неправильную декларацию XML и заменить ее правильной. Ни то, ни другое не должно быть особенно сложным.

1 голос
/ 13 января 2011

Общая процедура должна быть одинаковой независимо от того, на каком языке:

Откройте ваш файл, прочитайте необработанные байты в строку.

Попытка декодировать raw_bytes как UTF-8, с опцией, которая проверяет ошибки или вызывает исключение, если оно не является допустимым UTF-8.

Вероятность того, что файл значимого текста Unicode разумной длины, успешно закодированный как ISO-8859-1, пройдет этот тест UTF-8, очень мала (если, конечно, это ASCII, который является подмножеством обоих ISO-8859-1 и UTF-8).

Если тест не пройден, удалите объявление XML, если оно существует. Подготовьте это:

<?xml version="1.0" encoding="ISO-8859-1"?>

Кстати, вы уверены, что у вас есть данные ISO-8859-1, а не данные CP1252 (с платформы Windows)?

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