10 Stimmen

utf-8 und html-Einträge in RSS-Feeds

Ich schreibe einige RSS-Feeds in PHP und kämpfen mit Zeichen-Kodierung Probleme. Sollte ich utf8_encode() vor oder nach htmlentities() kodieren? Ich habe zum Beispiel sowohl kaufmännische als auch chinesische Zeichen in einem Beschreibungselement, und ich bin nicht sicher, welches davon richtig ist:

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

Und warum?

18voto

Eran Galperin Punkte 84916

Es ist wichtig, den Zeichensatz an die Funktion htmlentities zu übergeben, da der Standard ISO-8859-1 ist:

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

Sie sollten zuerst htmlentities anwenden, damit utf8_encode die Entitäten richtig kodieren kann.

(EDIT: Ich habe meine vorherige Meinung, dass die Reihenfolge keine Rolle spielt, aufgrund der Kommentare geändert. Dieser Code ist getestet und funktioniert gut).

15voto

Gumbo Punkte 617646

Erstens: Die utf8_encode función konvertiert von ISO 8859-1 nach UTF-8. Sie brauchen diese Funktion also nur, wenn Ihre Eingabekodierung/ Ihr Zeichensatz ISO 8859-1 ist. Aber warum verwenden Sie nicht von vornherein UTF-8?

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

Deshalb 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')

7voto

Kornel Punkte 94135

Verwenden Sie nicht htmlentities() ¡!

Verwenden Sie einfach UTF-8-Zeichen. Vergewissern Sie sich nur, dass Sie die Kodierung des Feeds in den HTTP-Headern angeben ( Content-Type:application/xml;charset=UTF-8 ) oder, falls dies nicht möglich ist, im Feed selbst mit <?xml version="1.0" encoding="UTF-8"?> in der ersten Zeile.

2voto

Es könnte einfacher sein, auf htmlentities zu verzichten und einen CDATA-Abschnitt zu verwenden. Das funktioniert für den Titelabschnitt, der im RSS-Viewer von Firefox keine kodierten HTML-Zeichen zu unterstützen scheint:

<title><![CDATA[News & Updates  " > »      Test!]]></title>

1voto

SoapBox Punkte 20141

Sie möchten Folgendes tun $output = htmlentities(utf8_encode($source)); . Der Grund dafür ist, dass Sie Ihre internationalen Zeichen zuerst in das korrekte UTF8-Format konvertieren wollen und dann die Ampersands (und möglicherweise auch einige der UTF-8-Zeichen) in HTML-Entities umwandeln wollen. Wenn Sie die Entities zuerst umwandeln, werden einige der internationalen Zeichen möglicherweise nicht richtig behandelt.

Wenn keines der internationalen Zeichen durch utf8_encode geändert werden soll, ist es egal, in welcher Reihenfolge Sie sie aufrufen.

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