2012-04-16 15 views
2

は、この単純な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関数に渡したためです。

問題は、私の場合には$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)); 

クリーナー解決策はありますか?

EDIT

$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

$データはどこから来ていますか? (クエリを含む) – Manuel

答えて

6

完全な例を示したあなたはXMLWriterは、エンコーディングを変換するアイデアを得たところ、私はよく分かりません。それはしません。 にutf-8を供給する必要があります。異なるエンコーディングを出力できますが、入力文字列はutf-8でなければなりません。二つの

一つは、ここで起こってすることができる:あなたが使用しているものは何でも

  1. ビューにあなたの出力文書が勝利-1252として文字列を解釈しています。 header('Content-Type: application/xml; charset=UTF-8');
  2. データベースにデータを正しく保存しておらず、 "é"が実際に2つのユニコード文字 "é"である場合は、コンテンツタイプヘッダーを次のように設定する必要があります。 。これを固定することは困難です。
関連する問題