PHP DOM UTF-8 problem

Zunächst, meine Datenbank verwendet, Windows-1250 als einheitlichen charset. Ich bin die Ausgabe der Daten als UTF-8. Ich bin mit iconv () - Funktion auf meiner website zum konvertieren von Windows-1250-strings in UTF-8-strings, und es funktioniert perfekt.

Das problem ist wenn ich mit PHP DOM parse HTML in der Datenbank gespeichert (der HTML-Code wird eine Ausgabe von einem WYSIWYG-editor und ist nicht gültig, hat es keine html -, head -, body-tags etc).

Den HTML könnte so Aussehen, beispielsweise:

<p>Hello</p>

Hier ist eine Methode, die ich verwenden, um zu analysieren, eine bestimmte HTML aus der Datenbank:

 private function ParseSlideContent($slideContent)
 {
        var_dump(iconv('Windows-1250', 'UTF-8', $slideContent)); //this outputs the HTML ok with all special characters

  $doc = new DOMDocument('1.0', 'UTF-8');

  //hack to preserve UTF-8 characters
  $html = iconv('Windows-1250', 'UTF-8', $slideContent);
  $doc->loadHTML('<?xml encoding="UTF-8">' . $html);
  $doc->preserveWhiteSpace = false;

  foreach($doc->getElementsByTagName('img') as $t) {
   $path = trim($t->getAttribute('src'));
   $t->setAttribute('src', '/clientarea/utils/locate-image?path=' . urlencode($path));
  }
  foreach ($doc->getElementsByTagName('object') as $o) {
   foreach ($o->getElementsByTagName('param') as $p) {
    $path = trim($p->getAttribute('value'));
    $p->setAttribute('value', '/clientarea/utils/locate-flash?path=' . urlencode($path));
   }
  }
  foreach ($doc->getElementsByTagName('embed') as $e) {
   if (true === $e->hasAttribute('pluginspage')) {
    $path = trim($e->getAttribute('src'));
    $e->setAttribute('src', '/clientarea/utils/locate-flash?path=' . urlencode($path));
   } else {
    $path = end(explode('data/media/video/', trim($e->getAttribute('src'))));
    $path = 'data/media/video/' . $path;
    $path = '/clientarea/utils/locate-video?path=' . urlencode($path);
    $width = $e->getAttribute('width') . 'px';
    $height = $e->getAttribute('height') . 'px';
    $a = $doc->createElement('a', '');
    $a->setAttribute('href', $path);
    $a->setAttribute('style', "display:block;width:$width;height:$height;");
    $a->setAttribute('class', 'player');
    $e->parentNode->replaceChild($a, $e);
    $this->slideContainsVideo = true;
   }
  }

  $html = trim($doc->saveHTML());

  $html = explode('<body>', $html);
  $html = explode('</body>', $html[1]);
  return $html[0];
 }

Die Ausgabe aus der Methode oben ist ein Müll mit allen Sonderzeichen ersetzt, mit seltsamen Sachen wie ÚÄ�.

Eine weitere Sache. Es funktioniert auf meinem Entwicklungs-server.

Funktioniert es nicht auf dem Produktions-server obwohl.

Irgendwelche Vorschläge?

PHP-version des production-Servers: PHP-Version 5.2.0RC4-dev

PHP-version der Entwicklungs-server: PHP Version 5.2.13


UPDATE:

Ich arbeite an einer Lösung selber. Ich habe eine inspiration aus dieser PHP-bug-report (nicht wirklich ein bug aber): http://bugs.php.net/bug.php?id=32547

Dies ist meine vorgeschlagene Lösung. Ich werde versuchen, es morgen und lassen Sie wissen, ob es funktioniert:

 private function ParseSlideContent($slideContent)
 {
        var_dump(iconv('Windows-1250', 'UTF-8', $slideContent)); //this outputs the HTML ok with all special characters

  $doc = new DOMDocument('1.0', 'UTF-8');

  //hack to preserve UTF-8 characters
  $html = iconv('Windows-1250', 'UTF-8', $slideContent);
  $doc->loadHTML('<?xml encoding="UTF-8">' . $html);
  $doc->preserveWhiteSpace = false;

  //this might work
  //it basically just adds head and meta tags to the document
  $html = $doc->getElementsByTagName('html')->item(0);
  $head = $doc->createElement('head', '');
  $meta = $doc->createElement('meta', '');
  $meta->setAttribute('http-equiv', 'Content-Type');
  $meta->setAttribute('content', 'text/html; charset=utf-8');
  $head->appendChild($meta);
  $body = $doc->getElementsByTagName('body')->item(0);
  $html->removeChild($body);
  $html->appendChild($head);
  $html->appendChild($body);

  foreach($doc->getElementsByTagName('img') as $t) {
   $path = trim($t->getAttribute('src'));
   $t->setAttribute('src', '/clientarea/utils/locate-image?path=' . urlencode($path));
  }
  foreach ($doc->getElementsByTagName('object') as $o) {
   foreach ($o->getElementsByTagName('param') as $p) {
    $path = trim($p->getAttribute('value'));
    $p->setAttribute('value', '/clientarea/utils/locate-flash?path=' . urlencode($path));
   }
  }
  foreach ($doc->getElementsByTagName('embed') as $e) {
   if (true === $e->hasAttribute('pluginspage')) {
    $path = trim($e->getAttribute('src'));
    $e->setAttribute('src', '/clientarea/utils/locate-flash?path=' . urlencode($path));
   } else {
    $path = end(explode('data/media/video/', trim($e->getAttribute('src'))));
    $path = 'data/media/video/' . $path;
    $path = '/clientarea/utils/locate-video?path=' . urlencode($path);
    $width = $e->getAttribute('width') . 'px';
    $height = $e->getAttribute('height') . 'px';
    $a = $doc->createElement('a', '');
    $a->setAttribute('href', $path);
    $a->setAttribute('style', "display:block;width:$width;height:$height;");
    $a->setAttribute('class', 'player');
    $e->parentNode->replaceChild($a, $e);
    $this->slideContainsVideo = true;
   }
  }

  $html = trim($doc->saveHTML());

  $html = explode('<body>', $html);
  $html = explode('</body>', $html[1]);
  return $html[0];
 }
Wussten Sie, stellen Sie sicher, dass Sie senden die entsprechenden Content-type-header? I. e. wenn Sie die Seite in firefox öffnen überprüfen, Ansicht->Zeichensatz ist auf UTF8 eingestellt.
Sie haben versucht, die Methode save: $doc->speichern();
Ich werde es versuchen. Warten Sie einige Minuten.

InformationsquelleAutor Richard Knop | 2010-08-23

Schreibe einen Kommentar