2012-04-16 53 views
2

把這個簡單的PHP代碼:與XMLWriter的(PHP)的編碼問題

$xmlWriter = new XMLWriter(); 
$xmlWriter->openURI('php://output'); 
$xmlWriter->startDocument('1.0', 'utf-8'); 

$xmlWriter->writeElement('test', $data); 

$xmlWriter->endDocument(); 
$xmlWriter->flush(); 

XMLWriter的類有一個很好的功能:它會轉換你給它的輸出編碼的任何數據。例如,在這裏它會將$data轉換爲UTF-8,因爲我在startDocument函數中通過了'utf-8'

的問題是,在我的情況下$data內容來自數據庫,其輸出格式爲UTF-8和因此已經在UTF-8。 XMLWriter 可能認爲數據在ISO-8859-1中,並再次將其轉換爲UTF-8,並且我得到奇怪的符號,我應該在其中獲得重音。

目前我正在使用來自數據庫的每個字符串周圍的utf8_decode,這意味着我將從UTF-8轉換爲ISO-8859-1,然後XMLWriter將其重新轉換爲UTF-8。

這工作,但不乾淨:

$xmlWriter->writeElement('test', utf8_decode($data)); 

是否有一個清晰的解決方案?

編輯:展示一個完整的例子

$xmlWriter = new XMLWriter(); 
$xmlWriter->openURI('php://output'); 
$xmlWriter->startDocument('1.0', 'utf-8'); 
$xmlWriter->startElement('usersList'); 

$database = new PDO('mysql:host=localhost;dbname=xxxxx', 'xxxxx', 'xxxxx'); 
$database->exec('SET CHARACTER SET UTF8'); 
$database->exec('SET NAMES UTF8'); 
foreach ($database->query('SELECT name FROM usersList') as $user) 
    $xmlWriter->writeElement('user', $user[0]); // if the user's name is 'hervé' in the database, it will print 'hervé' instead 

$xmlWriter->endElement(); 
$xmlWriter->endDocument(); 
$xmlWriter->flush(); 
+0

請問您能否顯示$ data的來源? (包括查詢) – Manuel 2012-04-16 14:38:35

回答

6

我不知道你在哪裏得到了XMLWriter轉換編碼的想法。它沒有。您需要必須爲它提供utf-8。它可以輸出不同的編碼,但輸入字符串必須是utf-8。

兩種情況之一可怎麼回事:

  1. 無論您使用的是視圖你的輸出文件解釋字符串作爲贏1252。如果您在瀏覽器中查看您的輸出,則可能需要設置內容類型標題,如下所示:header('Content-Type: application/xml; charset=UTF-8');
  2. 您將數據錯誤地存儲在數據庫中,而您的「é」實際上是兩個unicode字符「Ã」 。解決這個問題很困難。