/ / Poprawianie kodowania XML - kodowanie python, xml, perl,

Poprawianie kodowania XML - python, xml, perl, kodowanie

Mam xml z tagiem kodowania ustawionym na „utf-8”. Ale tak naprawdę jest to iso-8859-1.

Programowo, jak mogę to wykryć w Perlu i Pythonie? i jak mogę dekodować z innym kodowaniem?

W perlu próbowałem

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

ale to nie działa.

Odpowiedzi:

4 dla odpowiedzi № 1

Wykrywanie błędów jest często trudne, ponieważ losowe dane binarne często reprezentują poprawne łańcuchy w wielu kodowaniach.

W Perlu najłatwiej byłoby spróbowaćpróbować zdekodować go jako utf-8 i sprawdzić, czy nie wystąpiły awarie. (działa tylko w ten sposób; dokument w języku zachodnim zakodowany w utf-8 jest prawie zawsze również prawidłowym dokumentem iso-8859-1)

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

Teraz wykryłeś problem, musisz go obejść. Najprawdopodobniej będzie to zależało od biblioteki parsera, której używasz, ale niektóre typy powinny mieć zastosowanie.

Jeśli nie ma deklaracji XML lub typu MIME, zostanie użyte natywne kodowanie Perla, więc skopiowany kod powinien załatwić sprawę.

Jeśli istnieje błędna deklaracja XML, możesz ją zastąpić za pomocą dowolnej funkcji udostępnianej przez bibliotekę dekodowania XML lub po prostu zastąp ją ręcznie przed przekazaniem.

# assuming it"s on line 1:
$contents =~ s/.*/<?xml version="1.0" encoding="ISO-8859-1"?>/;

1 dla odpowiedzi nr 2

Ogólna procedura powinna być taka sama bez względu na język:

Otwórz plik, przeczytaj surowe bajty w łańcuchu.

Próbowano zdekodować raw_bytes jako utf-8, z opcją sprawdzającą błędy lub zgłaszającą wyjątek, jeśli nie jest poprawny utf-8.

Szansa, że ​​plik znaczącego tekstu Unicodeo rozsądnej długości pomyślnie zakodowanej jako ISO-8859-1 przejdzie ten test utf-8 jest bardzo niski (chyba że oczywiście jest to ASCII, który jest podzbiorem zarówno ISO-8859-1 i utf-8).

Jeśli test się nie powiedzie, usuń deklarację XML, jeśli istnieje. Przygotuj to:

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

Przy okazji, czy na pewno masz dane ISO-8859-1, a nie dane CP1252 (z platformy Windows)?


1 dla odpowiedzi nr 3

Oczywiście oczywiste jest, że znalezienie i poprawienie podstawowej przyczyny uszkodzenia danych jest zawsze lepsze niż próba wykrycia i naprawienia uszkodzenia po zdarzeniu.

Poza tym głównym celem jest toTwój plik nie jest „t XML, więc nie możesz go naprawić za pomocą narzędzi XML. Musisz zaatakować go na poziomie postaci lub binarnym. Jak powiedzieli inni, krok 1 polega na wykryciu, że utf-8 jest niepoprawny; krok 2 polega na usunięciu nieprawidłowej deklaracji XML i zastąpieniu jej poprawną.