2008-11-21 7 views
8

Ich schreibe einige RSS-Feeds in PHP und stuggling mit Zeichencodierungsproblemen. Sollte ich utf8_encode() vor oder nach htmlentities() encodieren? Zum Beispiel habe ich beide Et-Zeichen und chinesisches Schriftzeichen in einer Beschreibung Elemente bekommt, und ich bin nicht sicher, welche von diesen ist die richtige:utf-8 und htmlentities in RSS-Feeds

$output = utf8_encode(htmlentities($source)); or 
$output = htmlentities(utf8_encode($source)); 

Und warum?

+0

Warum verwenden Sie UTF-8 überhaupt nicht? – Gumbo

Antwort

17

Es ist wichtig, den Charakter auf die Funktion htmlentities gesetzt passieren, als Standard ist ISO-8859-1:

utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8')); 

Sie sollten htmlentities erste gelten als utf8_encode ungehindert die Entitäten zu kodieren.

(BEARBEITEN: Ich änderte von meiner Meinung vorher, dass die Reihenfolge nicht wichtig war, basiert auf den Anmerkungen. Dieser Code wird geprüft und funktioniert gut).

+0

Ordnung ist wichtig! utf8_encode vor htmlentities() wird ändern, wie es sich verhält. Vergleichen Sie den String urldecode ('% E2% 82% AC') mit und ohne zuerst utf8_encode() anzuwenden. – Kornel

+0

Sie haben Recht, aber es scheint, dass die Verwendung von htmlentities zuerst die richtige Methode ist (getestet). Habe meinen Beitrag geändert, um es zu reflektieren. –

1

Sie möchten $output = htmlentities(utf8_encode($source)); tun. Dies liegt daran, dass Sie zuerst Ihre internationalen Zeichen in UTF8 konvertieren und dann ein Und-Zeichen (und möglicherweise auch einige der UTF-8-Zeichen) in HTML-Entitäten einfügen möchten. Wenn Sie zuerst die Entitäten ausführen, werden einige der internationalen Zeichen möglicherweise nicht korrekt verarbeitet.

Falls keine Ihrer internationalen Zeichen werden durch utf8_encode geändert werden, dann spielt es keine Rolle, welche man sie in rufen Reihenfolge.

5

Nicht verwenden htmlentities()!

Verwenden Sie einfach UTF-8-Zeichen. Stellen Sie nur sicher, dass Sie die Codierung des Feeds in HTTP-Headern deklarieren (Content-Type:application/xml;charset=UTF-8) oder, falls dies nicht möglich ist, im Feed selbst unter Verwendung von <?xml version="1.0" encoding="UTF-8"?> in der ersten Zeile.

1

Es könnte leichter sein, Htmlentities zu vergessen und einen CDATA-Abschnitt zu verwenden. Es funktioniert für den Titel Abschnitt, der keine Unterstützung codierte HTML Charaktere in Firefox RSS Betrachter scheint:

<title><![CDATA[News & Updates " > » ☂ ☺ ☹ ☃ Test!]]></title> 
12

zuerst: Die utf8_encode function wandelt von ISO 8859-1 in UTF-8. Sie brauchen diese Funktion also nur, wenn Ihr Eingabecode/Zeichensatz ISO 8859-1 ist. Aber warum benutzt du UTF-8 überhaupt nicht?

Zweitens: Sie brauchen nicht htmlentities. Sie brauchen nur htmlspecialchars, um die Sonderzeichen durch Zeichenreferenzen zu ersetzen. htmlentities würde "zu viele" Zeichen ersetzen, die direkt mit UTF-8 codiert werden können. Wichtig ist, dass Sie die Anführungszeichen ENT_QUOTES verwenden, um die einfachen Anführungszeichen ebenfalls zu ersetzen.

Also mein Vorschlag:

// if your input encoding is ISO 8859-1 
htmlspecialchars(utf8_encode($string), ENT_QUOTES) 

// if your input encoding is UTF-8 
htmlspecialchars($string, ENT_QUOTES, 'UTF-8') 
+0

Diese Lösung hat mir geholfen. Genau der Abschnitt über 'ENT_QUOTES'. Vielen Dank – helvete

0

Nach vielen Versuch & Fehlern, fand ich endlich einen Weg, um richtig einen String aus einem UTF-8-kodierten Datenbankwert angezeigt wird über eine XML-Datei, auf eine HTML-Seite:

$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>'; 

Ich hoffe, das hilft jemandem.