6 Stimmen

Was macht DOMDocument mit meiner Zeichenfolge?

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

$str = '<p>Hello®</p>';

var_dump(mb_detect_encoding($str)); 

$dom->loadHTML($str);

var_dump($dom->saveHTML()); 

Siehe .

Ausgänge

string(5) "UTF-8"

string(158) "<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hello&Acirc;&reg;</p></body></html>
"

Warum hat mein Unicode ® werden umgewandelt in &Acirc;&reg; und wie kann ich das verhindern?

Bin ich heute verrückt geworden?

5voto

Jan Punkte 51

Sie können ein xml-Kodierungs-Tag hinzufügen (und es später wieder entfernen). Dies funktioniert für mich auf Dinge, die nicht auf Lager Centos 5.x (ubuntu, cpanel's php) sind:

<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$str = '<p>Hello®</p>';
var_dump(mb_detect_encoding($str)); 
$dom->loadHTML('<?xml encoding="utf-8">'.$str);
var_dump($dom->saveHTML()); 

Das ist das Ergebnis:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?xml encoding="utf-8"><html><body><p>Hello&reg;</p></body></html>

Außer an Tagen, an denen Sie das hier bekommen:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<?xml encoding="utf-8"><html><body><p>Hello&Acirc;&reg;</p></body></html>

4voto

graup Punkte 1059

Ich habe das Problem behoben, indem ich das UTF-8 dekodiert habe, bevor ich es an loadHTML weitergegeben habe.

$dom->loadHTML( utf8_decode( $html ) );

saveHTML() scheint Sonderzeichen wie deutsche Umlaute in ihre HTML-Entitäten zu dekodieren. (Obwohl ich die $dom->substituteEntities=false; ... o.O)

Dies ist jedoch recht merkwürdig, wie die Dokumentation zeigt:

Die DOM-Erweiterung verwendet die Kodierung UTF-8.

( http://www.php.net/manual/de/class.domdocument.php , Suche nach utf8)

Oh je, die Kodierung in PHP wirft immer wieder Probleme auf... eine unendliche Geschichte.

2voto

Ignacio Vazquez-Abrams Punkte 735200

Ihr Texteditor sagt "®" in UTF-8, aber die Bytes in der Datei sagen "®" in Latin-1 (oder einer ähnlichen Kodierung), die von PHP zum Lesen verwendet wird. Die Verwendung der Zeichenentitätsreferenz beseitigt diese Zweideutigkeit.

>>> print u'®'.encode('utf-8').decode('latin-1')
®

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X