我正在編寫一個Perl腳本,需要從XML文件中提取一些數據。Perl XML ::解析器編碼問題
XML文件本身使用UTF-8編碼。但是,出於某種原因,我從文件中提取的內容最終被編碼爲ISO-8859-1。該文檔指出,無論傳遞給我的處理程序應該是UTF-8,但它不是。
解析器基本上是這樣的:
my $parser = XML::Parser->new(Handlers => {
# Some unrelated handlers here
Char => sub {
my ($expat, $string) = @_;
if (exists $data->{$curId}{$curField}) {
$data->{$curId}{$curField} .= $string;
} else {
$data->{$curId}{$curField} = $string;
}
} ,
});
我曾嘗試以下變量的實際解析:
- 文件直接通過
$parser->parsefile
,沒有選項解析; - 文件通過
$parser->parsefile
直接解析,ProtocolEncoding
選項; - 使用
open($handle , "<file.xml")
打開文件,然後通過$parser->parse
解析; - 使用
open($handle , '<:utf8' , "file.xml")
打開文件,然後通過$parser->parse
解析。
此外,我已經嘗試過每個版本有和沒有<?xml encoding="utf-8"?>
頭在文件中。
在所有情況下,最終在$data->{$curId}{$curField}
中使用ISO-8859-1進行編碼。
我在做什麼錯?
剛剛嘗試過,似乎爲我工作得很好(在WinXP上的ActivePerl 5.12)。你可以檢查'$ string'是否被標記爲UTF-8,使用utf8; UTF8 :: is_utf8($字符串)'。如果你確實如此,那麼隨後的處理可能會出現問題。 – bvr 2011-03-19 11:33:23
你確定它是ISO-8859-1嗎?你是怎麼測試這個的?因爲如果您在任何未以utf-8模式打開的文件(例如STDOUT或STDERR)上使用'print',並且您的字符在ISO-8859-1範圍內,那麼默認情況下Perl會將它們轉換爲ISO-8859-1爲了兼容性)。您可以使用'binmode STDOUT':utf8「'來確保轉換不會發生在STDOUT上。 – mirod 2011-03-19 11:36:20
確實是這個問題 - 我不知道我必須改變STDOUT的模式,並假定它跟隨我的語言環境設置。多謝你們。 – 2011-03-19 11:54:16