次の単純な PHP コードを使用します。
$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'utf-8');
$xmlWriter->writeElement('test', $data);
$xmlWriter->endDocument();
$xmlWriter->flush();
XMLWriter クラスには優れた機能があります。このクラスは、渡されたデータを出力エンコーディングに変換します。たとえば、ここでは関数を渡したので、UTF-8 に変換さ$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));
よりクリーンなソリューションはありますか?
編集:完全な例を示す
$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();