Problemy z kodowaniem w XMLWriter (PHP)
Weź ten prosty kod PHP:
$xmlWriter = new XMLWriter();
$xmlWriter->openURI('php://output');
$xmlWriter->startDocument('1.0', 'utf-8');
$xmlWriter->writeElement('test', $data);
$xmlWriter->endDocument();
$xmlWriter->flush();
Klasa XMLWriter ma fajną funkcję: będzie konwertować dane, które podasz, na kodowanie wyjściowe. Na przykład tutaj się przekonwertuje$data
do UTF-8, ponieważ zdałem'utf-8'
wstartDocument
funkcjonować.
Problem polega na tym, że w moim przypadku zawartość$data
pochodzi z bazy danych, której format wyjściowy to UTF-8 idlatego jest już w UTF-8. XMLWriterprawdopodobnie myśli, że dane są w ISO-8859-1 i konwertuje je ponownie na UTF-8, a ja dostaję dziwne symbole gdzie powinienem uzyskać akcenty.
Obecnie używamutf8_decode
wokół każdego ciągu pochodzącego z bazy danych, co oznacza, że konwertuję z UTF-8 na ISO-8859-1, a następnie XMLWriter zamienia go z powrotem w UTF-8.
To działa, ale nie jest czyste:
$xmlWriter->writeElement('test', utf8_decode($data));
Czy istnieje czystsze rozwiązanie?
EDYTOWAĆ: pokazuje pełny przykład
$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();