2008-11-21 11 views
8

Piszę niektóre kanały RSS w PHP i szamocę z problemami z kodowaniem znaków. Czy powinienem utf8_encode() przed lub po kodowaniu htmlentities()? Na przykład, mam zarówno ampersandy i chińskich znaków w elemencie opisu, a nie jestem pewien, który z nich jest właściwa:utf-8 i htmlentities w kanałach RSS

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

i dlaczego?

+0

Dlaczego nie używasz UTF-8 w pierwszej kolejności? – Gumbo

Odpowiedz

17

Ważne jest, aby zdać zestaw znaków do funkcji htmlentities, jako domyślny ISO-8859-1:

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

należy zastosować htmlentities pierwszy, aby umożliwić utf8_encode do kodowania podmiotów prawidłowo.

(EDYTOWANIE: Zmieniłem z mojej opinii wcześniej, że zamówienie nie miało znaczenia na podstawie komentarzy. Ten kod jest testowany i działa dobrze).

+0

Zamówienie ma znaczenie! utf8_encode before htmlentities() zmieni sposób zachowania. Porównaj ciąg urldecode ('% E2% 82% AC') zi bez zastosowania utf8_encode() jako pierwsze. – Kornel

+0

Masz rację, jednak wygląda na to, że używanie htmlentities jako pierwszej jest właściwą metodą (przetestowane). Zmieniono mój post, aby to odzwierciedlić. –

1

Chcesz zrobić $output = htmlentities(utf8_encode($source));. Dzieje się tak dlatego, że najpierw chcesz przekonwertować swoje znaki międzynarodowe do właściwego UTF8, a następnie dodać znaki ampersands (i ewentualnie niektóre znaki UTF-8) do jednostek HTML. Jeśli robisz te obiekty jako pierwsze, niektóre międzynarodowe znaki mogą nie być obsługiwane poprawnie.

Jeśli żadna z twoich międzynarodowych znaków będą zmieniane przez utf8_encode, to nie ma znaczenia, który kolejności nazywają je.

5

Nie używaj htmlentities()!

Po prostu użyj znaków UTF-8. Po prostu upewnij się, że deklarujesz kodowanie kanału w nagłówkach HTTP (Content-Type:application/xml;charset=UTF-8) lub w przypadku braku tego, w samym źródle, używając <?xml version="1.0" encoding="UTF-8"?> w pierwszym wierszu.

1

Łatwiej jest zapomnieć o htmlentities i użyć sekcji CDATA. To działa dla sekcji tytułowej, która nie wydaje wsparcia zakodowany znaków HTML w Firefox RSS widza:

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

pierwsze: utf8_encode function konwertuje z ISO 8859-1 na UTF-8. Tak więc potrzebujesz tylko tej funkcji, jeśli kodowanie/zestaw znaków wejściowych to ISO 8859-1. Ale dlaczego nie używasz UTF-8 w pierwszej kolejności?

Po drugie: Nie potrzebujesz htmlentities. Potrzebujesz tylko htmlspecialchars, aby zastąpić znaki specjalne znakami literowymi. htmlentities zastąpiłoby "za dużo" znaków, które można zakodować bezpośrednio za pomocą UTF-8. Ważne jest, aby użyć stylu cytowania ENT_QUOTES, aby zastąpić również pojedyncze cudzysłowy.

Więc moja propozycja:

// 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

To rozwiązanie pomogło mi. Dokładnie sekcja o 'ENT_QUOTES'. Dzięki – helvete

0

Po wielu próbach & błędu, ale w końcu znalazł sposób, aby prawidłowo wyświetlić ciąg od wartości bazy utf8 zakodowane, za pośrednictwem pliku xml, do strony html:

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

Mam nadzieję, że to pomoże komuś.