2

次の単純な 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();
4

1 に答える 1

7

XMLWriterエンコーディングを変換するアイデアをどこで得たのかわかりません。そうではありません。utf-8を指定する必要があります。さまざまなエンコーディングを出力できますが、入力文字列はutf-8である必要があります。

ここでは、次の2つのいずれかが発生している可能性があります。

  1. 出力ドキュメントを表示するために使用しているものはすべて、文字列をwin-1252として解釈しています。ブラウザで出力を表示している場合は、次のようにcontent-typeヘッダーを設定する必要があります。header('Content-Type: application/xml; charset=UTF-8');
  2. データをデータベースに誤って保存しましたが、「é」は実際には2つのUnicode文字「é」です。これを修正するのは難しいです。
于 2012-04-16T14:54:20.283 に答える