Условное обозначение, как известно, сложно обнаружить, поскольку случайные двоичные данные часто представляют допустимые строки во многих кодировках.
В Perl проще всего попытаться декодировать его как utf-8 и проверить наличие сбоев. (Работает только этот окольный путь, в кодировке UTF-8 кодируются западным язык документа почти всегда является действительным изо-8859-1 документ, а)
my $xml = eval { decode_utf8($file, FB_CROAK) };
if ([email protected]) { 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"?>/;
У вас есть образец XML-файла, который вы не можете проанализировать? Я начинаю запутываться между объявленной кодировкой и «на самом деле». –