簡體   English   中英

更正XML編碼

[英]Correcting the XML encoding

我有一個xml,編碼標簽設置為'utf-8'。 但是,它實際上是iso-8859-1。

以編程方式,我如何在perl和python中檢測到這個? 以及如何使用不同的編碼進行解碼?

在perl中,我試過了

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

但是,這不起作用。

由於隨機二進制數據通常代表許多編碼中的有效字符串,因此檢測錯誤是非常棘手的。

在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"?>/;

無論使用何種語言,一般程序都應該相同:

打開文件,將原始字節讀入字符串。

嘗試將raw_bytes解碼為UTF-8,其中包含檢查錯誤的選項或如果它不是有效的UTF-8則引發異常。

成功編碼為ISO-8859-1的合理長度的有意義的Unicode文本文件通過此UTF-8測試的可能性非常低(除非它是ASCII,它是ISO-8859-1和UTF-的子集 - 8)。

如果測試失敗,則刪除XML聲明(如果存在)。 前置這個:

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

那么,您確定您確實擁有ISO-8859-1數據而不是CP1252數據(來自Windows平台)嗎?

當然,不用說,找到並糾正數據損壞的根本原因總是比在事件發生后檢測和修復損壞更好。

除此之外,要說明的是,您的文件不是XML,因此您無法使用XML工具進行修復。 您需要在字符或二進制級別攻擊它。 正如其他人所說,第1步是檢測它是無效的UTF-8; 第2步是刪除不正確的XML聲明並將其替換為正確的聲明。 這些都不應該特別困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM