2010-05-24 19 views
1

我對perl XML庫不太流利(實際上,我真的很瞭解編碼),我所做的只是將一個可能包含字符(如「à」)並將其放入XML中的字符串文件,但是當我打開文件時,在包含這樣的字符的行處出現編碼錯誤。我如何編碼一個Perl字符串,以便將其放入XML文檔中?

所以我只需要一個輕量級的方式來接受一個字符串並將其編碼爲XML。

回答

4

您的XML應指定UTF-8編碼。例如:

<?xml version="1.0" encoding="UTF-8" ?> 

有很多很好的信息在UTF-8 and Unicode Standards

您的Perl程序還應該將其輸出文件句柄設置爲UTF-8編碼,以便正確寫入數據。例如,請參閱open的perl文檔。

唯一需要的XML特定轉義是用於XML保留字符。請參閱Stackoverflow上的Where can I get a list of the XML document escape characters?

您可以使用Perl的XML::Code或類似的模塊使用LibXML,這是XML標準的大鐵錘逃離XML專用字符

+2

答案可能是好了很多:①草率的超文本的副本(使用「這裏」,貧血鏈接文本)。 ②可能引起混淆的信息:'使用utf8;'實際上只是告訴Perl程序員已經用UTF-8編碼了Perl源代碼。這與用問題中提出的編碼來編寫文件是不同的概念。 ③不準確的術語:*分隔符*(XML§4.6)需要轉義。 ④缺乏模塊的固定鏈接。 – daxim 2010-05-24 08:37:15

+2

我修復了所有這些。我想你錯過了最大的問題:你不應該手工編寫XML,所以你不應該想到這一點。使用一個完全爲你做的模塊。 :)哦,並得到更多的代表,你也可以修復的東西:) – 2010-05-24 16:30:02

4

例。不是輕量級的,但你的問題確實是一個熟悉的指甲,至少我們也沒有花太多時間編寫代碼。

use XML::LibXML(); 
XML::LibXML::Document->new('1.0', 'UTF-8')->createTextNode($text)->toString; # returns properly encoded fragment 

查看用於寫入文件的方法toFile

1

我無法得到答案2的工作。試試這個,它產生XML它說「沒有很好地形成(標記無效)」:

#!/usr/bin/perl -wT 

use XML::LibXML; 
use HTML::Entities; 

binmode(STDOUT, ':utf8'); 
my $string = 'foo &auml; bar'; 
$string = decode_entities($string); 
print XML::LibXML::Document->new('1.0', 'UTF-8')->createTextNode($string)->toString(); 
相關問題