2013-01-13 34 views
0

我解析CP1250編碼的字符串與simplexml_load_string。所以,我在<?xml version="1.0" encoding="windows-1250"?>的字符串開頭說明它。不幸的是,所有節點在simplexml_load_string輸出中都以UTF8編碼。如何設置simplexml_load_string的輸出編碼PHP函數

有沒有一種方法,如何指定輸出編碼以及或我使用的iconv使用時的輸出?

回答

2

你的問題是不完全清楚我,所以我儘量回答它在我的理解方式,有可能給出的答案是那麼。

如果裝入CP1250/Windows的1250編碼字符串和字符串包含在XML declration該編碼信息,通常默認的SimpleXML已經保持此爲輸出。所以通常你不需要在這裏做任何事情。

不過,若你需要顯式地設置輸出編碼:

一個SimpleXMLElement不允許你改變由它自己的編碼。然而,像SimpleXML經常在它自己無法做到的時候,姊妹庫DOMDocument能夠。因爲他們都是姐妹,所以他們可以互相交流。在下面的例子中,我加載UTF-8編碼的字符串,然後設置XML輸出編碼US-ASCII明確:

$inputUTF8 = <<<INPUT 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    Äpfel wachsen überirdisch 
</root> 
INPUT; 

$xml = simplexml_load_string($inputUTF8); // load UTF-8 encoded string 
$xml->asXML('php://output'); // outputs as UTF-8 (same as input by default) 

// set document encoding to US-ASCII via DOMDocument 
$doc = dom_import_simplexml($xml)->ownerDocument; 
$doc->encoding = 'US-ASCII'; 

$xml->asXML('php://output'); // outputs as US-ASCII 

作爲遵循的輸出:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    Äpfel wachsen überirdisch 
</root> 
<?xml version="1.0" encoding="US-ASCII"?> 
<root> 
    &#196;pfel wachsen &#252;berirdisch 
</root> 

作爲該顯示,則DOMDocument::$encoding屬性更改了輸出編碼,即使是SimpleXMLElement,也不是字符集的一部分的字符被表示爲它們的Unicode碼位的數字XML實體(這裏的Ä是U + 00C4,十進制196是十六進制)。使用Windows -1250作爲輸出enc oding會給我一個未知字符錯誤在屏幕上:

// set document encoding to Windows-1250 via DOMDocument 
$doc = dom_import_simplexml($xml)->ownerDocument; 
$doc->encoding = 'Windows-1250'; 

$xml->asXML('php://output'); // outputs as Windows-1250 

輸出繼電器(UTF-8顯示):

<?xml version="1.0" encoding="Windows-1250"?> 
<root> 
    �pfel wachsen �berirdisch 
</root> 

二進制八位位組C4FC不能顯示爲UTF-8,以便在這裏在我的情況下,顯示。這也顯示輸出是在Windows-1250編碼中的,否則顯示器將顯示這些字符。

我希望這是有益的甚至是 - 寫在我的答案的開始 - 從你描述它是沒有必要指定編碼輸出。如果結果與本答案中概述的不同,請分享您的PHP和libxml版本。